如何在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
。