如何使用mktime来尊重时区

如何在Linux / gcc中创build时区感知的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); 

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

  time.ctime(1349045100) 

我正在使用的是:

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

所以看来,当我构build的时间已经是一个小时了。 我该如何纠正?

你的问题几乎可以肯定,你的tm结构体的tm_isdst标志默认为0,这使得即使在夏天(你的日期是这样)它也不会假定为夏令时。 然后,当您转换回本地时间它DID添加DST偏移量,导致您注意到的差异。

最简单也是最正确的解决方案是将tm_isdst成员设置为-1,让mktime找出是否应该使用DST偏移量。

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

如果您的应用程序有任何机会被线程化,请考虑使用localtime_r而不是localtime