如何在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));
所以当我构建时间时,似乎已经有一个小时了。我该如何纠正?
答案 0 :(得分:3)
你的问题几乎可以肯定,tm_isdst
结构的tm
标志默认为0,导致它即使在夏天(你的日期也是如此)也没有DST。然后,当您转换回本地时,它会添加DST偏移量,从而导致您注意到的差异。
最简单且通常正确的解决方案是将tm_isdst
成员设置为-1,让mktime
确定相关日期是否应该应用DST偏移量。
请注意,DST是否有效正交到您正在使用的时区。两者都需要以正确的方式设置才能使结果正确显示。
如果您的应用程序有可能被线程化,也请考虑使用localtime_r
而不是localtime
。