Как преобразовать timezoned XML-тип dateTime в time_t с переполнением стека

Я пытаюсь конвертировать 2014-08-19T10: 05: 33Z в time_t.

Мой код приводит к: 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 часа.

1

Решение

С помощью Бесплатная, кроссплатформенная библиотека datetime Говарда Хиннанта с открытым исходным кодом, только для заголовков, Вы можете сделать это так:

#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
1

Другие решения

увидеть: http://man7.org/linux/man-pages/man3/timegm.3.html
Используйте timegm вместо mktime, но я думаю, что он недоступен для Windows

0

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

mktime — C ++:

time_t mktime (struct tm * timeptr);

Конвертировать структуру tm в time_t

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

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

    extern long timezone;
timeStamp += timezone;
0
По вопросам рекламы [email protected]