我想用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/