2011-06-28 95 views
1

到类似:历史时间GMT UTC与DST

Convert historical time to GMT

这一次我的情况是: 我需要一些字符串时间转换格式为“2011061411322100”为GMT。问题是时代来自另一台个人电脑,并且是一个历史时期。所以我没有实时获得时间,所以我不能简单地从我的代码运行的盒子上的当地时间获取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吗?我如何知道要设置什么?

+2

看着你的另一个问题我有点困惑:是2011061411322100 GMT/UTC或当地时间?另一台个人电脑总是和主机一样处于同一时区吗?您希望输出的格式是什么? - 具有GMT/UTC值的结构tm? –

+2

tz数据库http://en.wikipedia.org/wiki/Tz_database有关于历史时区的信息;但只有当你知道时区并且你知道另一台PC正在遵守规则时才有用。 –

+1

可以在C++系统中使用吗? –

回答

1

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

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