如何使用 MKtime 尊重时区

how to use mktime to respect timezone

本文关键字:时区 MKtime 何使用      更新时间:2023-10-16

如何在 Linux/gcc 中创建时区感知struct tm?我有以下代码:

struct tm date;
date.tm_year=2012-1900;
date.tm_mon=9;
date.tm_mday=30;
date.tm_hour=17;
date.tm_min=45;
date.tm_sec=0;
date.tm_zone="America/New_York";
time_t t = mktime(&date);

当我打印t时,值是1349045100。所以我把它使用 c++ 和 python 打印为字符串,它返回我:Sun Sep 30 18:45:00 2012 这是一个小时的偏差。我想要17:45而不是18:45。我正在使用的python命令是:

 time.ctime(1349045100)

我正在使用C++是:

::setenv("TZ", "America/New_York",1);
::tzset();
strftime(tm_str, len_tm_str, "%Y%m%d %H:%M:%S", ::localtime(&t));

所以当我构建时间时,它似乎已经偏离了一个小时。我该如何纠正?

您的问题几乎可以肯定是tm结构的tm_isdst标志默认为 0,这导致即使在夏天(您的日期是)也没有 DST。然后,当您转换回本地时间时,它确实添加了 DST 偏移量,从而导致您注意到的差异。

最简单且通常正确的解决方案是将tm_isdst成员设置为 -1,mktime确定相关日期是否应应用 DST 偏移量。

请注意,DST 是否有效与您使用的时区正。两者都需要以正确的方式设置才能正确显示结果。

此外,如果您的应用程序有可能被线程化,请考虑使用 localtime_r 而不是 localtime