澳大利亚时区mktime错了吗?

时间:2014-09-18 03:04:49

标签: c++ linux mktime

我想构建一个带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,任何人都知道为什么?

1 个答案:

答案 0 :(得分:0)

使用此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更容易和更安全地进行时间处理。