时间转换不具有确定性

Time conversions not deterministic

本文关键字:确定性 转换 时间      更新时间:2023-10-16

我写了一个程序,应该将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,我的电脑在欧洲/维也纳时区。

mktime尊重std::tmtm_isdst成员。CCD_ 8不改变该标志并且保留其先前的值。由于std::tm是POD,tm_isdst在默认构造中没有初始化,因此需要手动初始化,否则会得到indeteminate值。