c++ - 时间转换不确定

标签 c++ c++11 debian

我编写了一个程序,可以将 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 成员。 strptime 不会更改该标志并保留其先前的值。由于std::tm是POD,tm_isdst默认构造时没有初始化,所以需要手动初始化,否则会得到不确定的值。

关于c++ - 时间转换不确定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682012/

相关文章:

C++ 字符串到/从文件

c++ - 我需要知道如何在 C++ 中使用增量值增加到一定数量

c++ - 使用 lambda 作为试运行选项正常吗?

'dist-packages' 与 'site-packages' 中的 Python 模块

c++ - 泛化到多个 BLAS/LAPACK 库

c++ - 在父类 cpp 中使用子函数

c++ - 关闭clang中的类型转换

c++ - 在模板派生类中继承具有类型别名的构造函数

shell - scala -i 命令行选项应该做什么?

linux - 即使在 Debian 上进行无人值守升级,安全更新仍未决