gpt4 book ai didi

c++ - 时间转换不确定

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:49 24 4
gpt4 key购买 nike

我编写了一个程序,可以将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com