如何在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来打印为字符串,它返回我:2012年9月30日18:45:00,这是一个小时的休假.我要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));
因此,当我构造时间时,似乎已经是一个小时了.我该如何纠正?
解决方法:
您的问题几乎可以肯定是,您的tm结构的tm_isdst标志默认设置为0,这导致即使在夏天(您的日期),它也不会采用任何DST.然后,当您转换回本地时间时,它会DID添加DST偏移量,从而引起差异.
最简单且通常正确的解决方案是将tm_isdst成员设置为-1,以让mktime找出有关日期是否应应用DST偏移量.
请注意,DST是否有效与您使用的时区正交.两者都需要以正确的方式设置才能正确显示结果.
如果您的应用程序有可能被线程化,也请考虑使用localtime_r而不是localtime.