2013-11-01 114 views
3

如何在Linux/gcc中创建时区知识struct tm? 我有以下代码:如何使用mktime来尊重时区

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); 

当我打印t1349045100。所以我把这个同时使用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)); 

如此看来,当我构建它已经是一个小时的时间。我该如何纠正?

回答

3

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

最简单且经常正确的解决方案是将tm_isdst成员设置为-1,以便mktime找出是否所应考虑的日期应用了DST偏移量。

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

如果您的应用程序有线程的话,还可以考虑使用localtime_r而不是localtime

+0

so tm.timezone assignment is ignored? – user2426361

相关问题