3

如何struct tm在 Linux/gcc 中创建时区感知?我有以下代码:

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

因此,当我构建时间时,似乎已经休息了一个小时。我该如何纠正?

4

1 回答 1

4

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

最简单且通常正确的解决方案是将tm_isdst成员设置为 -1 以mktime判断相关日期是否应应用 DST 偏移量。

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

如果您的应用程序有可能被线程化,也请考虑使用localtime_r而不是。localtime

于 2013-11-01T16:09:21.740 回答