【问题标题】:Historical time to GMT\UTC with DSTGMT\UTC 与 DST 的历史时间
【发布时间】:2011-09-24 09:28:28
【问题描述】:

类似于:

Convert historical time to 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 吗?我怎么知道要设置什么?

【问题讨论】:

  • 看你的另一个问题我有点困惑:2011061411322100 GMT/UTC 还是当地时间?另一台 PC 是否总是与您的主机 PC 处于同一时区?您希望以什么形式输出 - 带有 GMT/UTC 值的 struct tm?
  • tz 数据库en.wikipedia.org/wiki/Tz_database 有关于历史时区的信息;但这只有在您知道时区并且知道另一台 PC 遵守规则时才有用。
  • 可以在c++系统中使用吗?
  • 时间发生变化时是否可以监听 Windows 事件?

标签: c++ utc gmt ctime


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 2011-09-23
    • 1970-01-01
    • 2012-12-25
    • 2022-10-04
    • 2011-05-16
    • 2010-12-09
    • 2011-12-14
    • 2012-10-07
    相关资源
    最近更新 更多