【问题标题】:mktime wrong for Australia timezone?澳大利亚时区的 mktime 错误?
【发布时间】:2014-09-18 03:04:48
【问题描述】:

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

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,有人知道为什么吗?

【问题讨论】:

  • 看一下 UTC 转换:stackoverflow.com/a/3661129/3895252
  • setenv 和 tzset 使用正确的时区来达到目的,以便 mktime 可以使用当前的本地时区。但这似乎不起作用。
  • @user2426361 将tm_isdst 设置为非随机值怎么样,它有效吗?
  • @n.m.是的,我错过了那部分,对不起。是的,设置tm_isdst = -1 有效。所以这个故事的寓意是 setenv 是不够的,我需要将该标志设置为 -1 以便 mktime 将尝试确定 dst 是否来自本地时区。谢谢。

标签: c++ linux mktime


【解决方案1】:

使用此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 更容易和更安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2012-05-22
    • 2015-05-03
    相关资源
    最近更新 更多