使用DST到GMT \ UTC的历史时间

时间:2011-06-28 14:40:28

标签: c++ utc gmt ctime

类似于:

Convert historical time to GMT

这次我的情景是: 我需要将格式为“2011061411322100”的字符串时间转换为GMT。问题是,时代来自另一台PC,是一个历史时期。所以我没有实时获得时间,所以我不能简单地从当地时间到我的代码运行的盒子上获取GMT。

时间表示开始和结束时间。如果我的代码在时间更改期间运行,则时间更改将在我正在获取时间的远程框上应用。因此,如果在开始和结束时间之间发生变化,则结束时间将被抵消。

我假设我必须先转换为tm:

// add to tm struct
tm tmTime;
tmTime.tm_hour = hour; 
tmTime.tm_min = min; 
tmTime.tm_sec = sec; 
tmTime.tm_mday = day; 
tmTime.tm_mon = (month-1); 
tmTime.tm_year = (year - 1900); 

然后转换为time_t

time_t tmInTime_t = mktime( &tmTime );

然后使用gmtime:

struct tm *gmt = gmtime( &tmInTime_t );

如果在开始和结束之间发生时间变化,这仍然会导致大的增量。我该如何解决? 我需要设置.tm_isdst吗?我怎么知道要设置什么?

1 个答案:

答案 0 :(得分:1)

绝对必须知道源数据上的参考时区。简单地说它是源机器上的本地时间并不能提供足够的信息。 考虑(对于许多例子中的一个例子):2007年美国的DST规则发生了变化,跨越该范围的任何日期计算都必须考虑到这一点。当你开始跨政治边界处理时区时,事情变得更加复杂。

http://www.boost.org/doc/libs/1_47_0/doc/html/date_time.html 是一个用C ++编写的健壮时间/日期库的示例,适用于大多数平台。它允许您对日期和时间执行各种“算术”运算。它还包括对TZ数据库的支持,这将允许您在跨越时区规则更改的日期时间上执行操作。

相关问题