如何使用mktime来尊重时区

时间:2013-11-01 16:00:26

标签: c++ linux gnu

如何在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));

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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