我想用struct tm时区构造一个Australia/Sydney,所以我首先使用:

setenv("TZ","Australia/Sydney",1);
tzset()


然后将struct tm设置为:

struct tm _tm;
_tm.tm_sec = 0;
_tm.tm_min = 45;
_tm.tm_hour = 7;
_tm.tm_mday = 18;
_tm.tm_mon = 8;
_tm.tm_year = 114;


这应该设置为澳大利亚时间2014/09/18 7:45:00
然后我打电话给:

time_t other_tm = mktime(&_tm);


通话后,other_tm_tm都指向澳大利亚时间上午6:45!原因是other_tm的值为1410986700,您可以从Epoc转换器验证它的确指向6:45 am,有人知道为什么吗?

最佳答案

使用此cross-platform, free, open-source C++11/14 <chrono>-based library,这是一种获得所需结果的现代方法:

#include "tz.h"
#include <iostream>

int
main()
{
    using namespace std::chrono_literals;
    using namespace date;
    auto zt = make_zoned("Australia/Sydney", local_days{2014_y/9/18} + 7h + 45min);
    std::cout << zt.get_sys_time().time_since_epoch().count() << '\n';
}


输出:

1410990300


(即1410986700 + 3600)

这个库比陈旧的C API更易于使用和安全。

关于c++ - mktime对澳大利亚时区错误吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25903518/

10-11 00:52