1

如同:

将历史时间转换为 GMT

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

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

我假设我必须首先转换为 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 吗?我怎么知道要设置什么?

4

1 回答 1

1

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

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

于 2011-08-02T03:02:50.390 回答