Я пытаюсь конвертировать 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 часа.
С помощью Бесплатная, кроссплатформенная библиотека 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
увидеть: http://man7.org/linux/man-pages/man3/timegm.3.html
Используйте timegm вместо mktime, но я думаю, что он недоступен для Windows
кажется неправильным, поскольку разница во времени составляет 2 часа.
time_t mktime (struct tm * timeptr);Конвертировать структуру tm в time_t
Возвращает значение типа time_t, которое представляет местное время
описывается тм структура указала
по timeptr (который может быть изменен).
Так как он возвращается местное время, Вы должны приспособиться к timezone
если вы хотите UTC; вставить
extern long timezone;
timeStamp += timezone;