在C / C ++中在本地时间和GMT / UTC之间转换
在C / C ++中,在本地时间和UTC之间转换日期时间的最佳方法是什么?
“datetime”是指包含日期和时间的一些时间表示。 我会对time_t
, struct tm
或任何其他使其成为可能的表示感到满意。
我的平台是Linux。
这是我正在尝试解决的具体问题:我得到一对包含julian日期和一天中的秒数的值。 这些值是格林威治标准时间。 我需要将其转换为本地时区“YYYYMMDDHHMMSS”值。 我知道如何将朱利安日期转换为YMD,显然很容易将秒转换为HHMMSS。 然而,棘手的部分是时区转换。 我相信我可以找到解决方案,但我更愿意找到一种“标准”或“众所周知”的方式而不是磕磕绊绊。
可能相关的问题是在C中获取时区的夏令时转换日期
你应该使用gmtime
/ localtime
和timegm
/ 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
的tm_gmtoff
。
如果在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);
或类似的东西……
如果您需要担心使用时区规则转换日期/时间,您可能需要查看ICU 。