在C / C ++中在本地时间和GMT / UTC之间转换

时间:2009-04-17 19:11:44

标签: c++ c timezone dst

在C / C ++中,在本地时间和UTC之间转换日期时间的最佳方法是什么?

“datetime”是指包含日期和时间的一些时间表示。我会对time_tstruct tm或任何其他使其成为可能的陈述感到满意。

我的平台是Linux。

这是我正在尝试解决的具体问题:我得到一对包含julian日期和一天中的秒数的值。这些值是格林威治标准时间。我需要将其转换为本地时区“YYYYMMDDHHMMSS”值。我知道如何将朱利安日期转换为Y-M-D,显然很容易将秒转换成HHMMSS。然而,棘手的部分是时区转换。我相信我可以找到解决方案,但我更愿意找到一种“标准”或“众所周知”的方式,而不是磕磕绊绊。


可能相关的问题是Get Daylight Saving Transition Dates For Time Zones in C

3 个答案:

答案 0 :(得分:21)

您应该使用gmtime / localtimetimegm / mktime的组合。这应该为您提供正交工具,以便在struct tmtime_t之间进行转换。

对于UTC / GMT:

time_t t;
struct tm tm;
struct tm * tmp;
...
t = timegm(&tm);
...
tmp = gmtime(t);

对于当地时间:

t = mktime(&tm);
...
tmp = localtime(t);

所有tzset()都设置了TZ环境变量的内部时区变量。我认为不应该多次调用它。

如果您尝试在时区之间进行转换,则应修改struct tm的{​​{1}}。

答案 1 :(得分:17)

如果在Windows上,您没有timegm()可用:

struct tm *tptr;
time_t secs, local_secs, gmt_secs;
time( &secs );  // Current time in GMT
// Remember that localtime/gmtime overwrite same location
tptr = localtime( &secs );
local_secs = mktime( tptr );
tptr = gmtime( &secs );
gmt_secs = mktime( tptr );
long diff_secs = long(local_secs - gmt_secs);

或类似的......

答案 2 :(得分:2)

如果您需要担心按时区规则转换日期/时间,可能需要查看ICU