31

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

“日期时间”是指包含日期和时间的一些时间表示。time_t我会对,struct tm或任何其他使其成为可能的表示方式感到满意。

我的平台是Linux。

这是我要解决的具体问题:我得到一对包含儒略日期和一天中的秒数的值。这些值在 GMT 中。我需要将其转换为本地时区“YYYYMMDDHHMMSS”值。我知道如何将儒略日期转换为 YMD,显然很容易将秒转换为 HHMMSS。然而,棘手的部分是时区转换。我确信我可以找到解决方案,但我更愿意找到一种“标准”或“众所周知”的方式,而不是四处走动。


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

4

3 回答 3

23

您应该使用gmtime/localtimetimegm/的组合mktime。那应该为您提供正交工具来在 和 之间进行struct tm转换time_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's tm_gmtoff.

于 2009-04-17T19:17:07.513 回答
19

如果在 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);

或类似的东西...

于 2009-06-24T16:12:44.660 回答
3

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

于 2009-04-18T02:57:19.107 回答