我编写了一个程序,应该将iso 8601
字符串转换为std::chrono::system_clock::time_point
。
但它有时会有不确定的行为。
如果多次执行程序,则解析的时间戳相差1小时。
据我所知,当你想将日期字符串(iso 8601
)转换为std::chrono::system_clock
类型时,你当前需要一些来自ctime的函数(这意味着你需要使用c-函数),如果你不想使用外部库。
所以我使用了strptime(),mktime()和std :: tm_t。
这是MWE:
#include <chrono>
#include <ctime>
#include <iostream>
#include <sstream>
int main(void) {
std::tm t;
strptime("2016-01-01T00:00:00", "%Y-%m-%dT%H:%M:%S", &t);
auto time = mktime(&t);
std::cout << "UNIX-seconds: " << time << std::endl;
//std::cout << "tm-hours: " << t.tm_hour << ", UNIX-seconds: " << time << std::endl;
auto tp = std::chrono::system_clock::from_time_t(time);
{
std::stringstream ss;
std::chrono::system_clock::to_time_t(tp);
}
}
如果用g ++编译它--std = c ++ 14 main.cpp -o out
并多次运行,我得到以下2个输出中的一个:
UNIX-seconds: 1451599200
或
UNIX-seconds: 1451602800
但我目前不知道为什么有时会得到第一个,有时是第二个。
如果取消注释注释行,不确定行为就会消失,我得到以下行:
tm-hours: 0, UNIX-seconds: 1451602800
我能做些什么来获得确定性行为?
我有debian 8,g ++ v4.9,我的电脑在时区欧洲/维也纳。
答案 0 :(得分:3)
mktime
尊重tm_isdst
成员std::tm
。 strptime
不会更改该标志,并且会保留其先前的值。由于std::tm
是POD,tm_isdst
未按默认构造初始化,因此您需要手动初始化它,否则您将获得不确定的值。