2014-12-18 2 views
1

Я пытаюсь преобразовать 2014-08-19T10: 05: 33Z в time_t.Как преобразовать временный XML-тип dateTime в time_t с C++

Мой код результаты: 1408435533

std::string expirationTime("2014-08-19T10:05:33Z"); 
struct tm tm; 
memset(&tm, 0, sizeof(tm)); 
strptime(expirationTime.c_str(), "%Y-%m-%dT%TZ", &tm); 
time_t timeStamp = mktime(&tm); 
printf("time_t for %s is %ld \n\n", expirationTime.c_str(), timeStamp); 

Результат:

time_t for 2014-08-19T10:05:33Z is 1408435533 

Но когда я использую онлайн конвертер эпохальное я получаю следующее:

1408435533 
Is equivalent to: 

08/19/2014 @ 8:05am (UTC) 
2014-08-19T08:05:33+00:00 in ISO 8601 

, который, кажется, быть неправильным, так как разница в 2 часа.

+0

Одумались ли вы на ваш часовой пояс? вы можете сказать, что ваш код изменяет время с текущим часовым поясом (т. е. UTC + смещение). Результат онлайн для UTC. – Damon

+0

Код, как показано выше, не изменяет время. На основе строки, представленной «2014-08-19T10: 05: 33Z», как я могу извлечь смещение часового пояса? Спасибо! – gliatsos

+0

Вы можете попробовать конвертировать текущую временную эпоху с кодом и онлайн-конвертером. Сравните эти результаты. Если разница соответствует смещению для вашего часового пояса, просто вычтите его. – Damon

ответ

0

кажется неправильным, так как есть 2 Разница во времени ч.

mktime - C++ Reference:

time_t mktime (struct tm * timeptr);
Преобразовать структуру ТМА time_t

Возвращает значение типа time_t, представляющее местное время описываемого tm структуры указала на timeptr (который может быть изменен).

Поскольку он возвращает местное время, вы должны настроить для timezone если вы хотите UTC; вставить

extern long timezone; 
    timeStamp += timezone; 
1

Использование Howard Hinnant's free, open-source, header-only, cross-platform, datetime library, вы можете сделать это следующим образом:

#include "chrono_io.h" 
#include "date.h" 
#include <iostream> 
#include <sstream> 

int 
main() 
{ 
    using namespace date; 
    std::string expirationTime("2014-08-19T10:05:33Z"); 
    std::istringstream in{expirationTime}; 
    sys_seconds timeStamp; 
    in >> parse("%Y-%m-%dT%TZ", timeStamp); 
    std::cout << "timeStamp is " << timeStamp.time_since_epoch() 
       << " which is " << timeStamp << '\n'; 
} 

Это создает на вершине std::chrono библиотеки, которая была введена с C++ 11. Вышеуказанные программные выходы:

timeStamp is 1408442733s which is 2014-08-19 10:05:33