在 Windows XP/Server 2003 下将新旧本地时间转换为 UTC

Posted

技术标签:

【中文标题】在 Windows XP/Server 2003 下将新旧本地时间转换为 UTC【英文标题】:Converting old and new local times to UTC under Windows XP/Server 2003 【发布时间】:2010-11-18 16:39:54 【问题描述】:

我的应用程序将过去和现在的日期从本地时间转换为 UTC。

我需要确保在仍能正确处理过去日期的同时遵守任何未来对 Windows 的 DST 更新。

应用程序是用 C++ 编写的,在 Server 2003 上运行。

我研究过的选项:

gmtime() and localtime() are not always correct for past dates 因为他们只会遵守当前的 DST 规则。 (related SO question)

tz database 已停用,因为它需要单独手动更新。

GetTimeZoneInformationForYear() 已退出,因为它需要 Vista/Server 2008。

Past DST information is stored in the registry,但我正在寻找更高级别的东西。

提升date_time:

us_dst_rules 类已弃用,并且不会在操作系统更新时更新。 class dst_calc_engine<> 是它的继任者,但它也不尊重操作系统更新。

所以...

...还有其他人使用原始注册表解决方案来执行此操作吗?

...还有其他建议吗?

(编辑:发现dst_calc_engine doesn't support DST updates)

【问题讨论】:

【参考方案1】:

我想我更愿意根据HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 注册表中的信息重新实现GetTimeZoneInformationForYear 和可能的GetDynamicTimeZoneInformation

这样,您的代码将跟随 Windows 更新,您可以将脏代码换出,以便在上层平台上实际实现。

由于您不想使用外部数据库,我认为没有其他选择是可行的。

【讨论】:

我喜欢用与替代品相同的签名重新实现它的想法,这样当我们迁移到 Server 2008 时,原生 API 就可以成为替代品。 不过,有(至少 :) 一个与该策略相关的风险。这两个函数是相当新的——如果在其中发现错误,并且它们与时区数据一起以新格式更新,则您的函数可能会被破坏。这似乎不太可能,但在使用“API 下”数据时总是存在风险,例如时区信息的注册表支持。 @kol 不,抱歉,我还没有实现它。当我回答这个问题时,我已经对可能拥有的 Windows 时区信息做了足够多的工作,但现在我已经忘记了大部分内容:-)【参考方案2】:

您可以将 gmtime() 和 localtime() 用于 2007 年及以后的日期(并利用 Windows DST 更新),并使用 Boost 或您提到的其他解决方案之一来使用 2006 年及更早版本的正确 DST 规则。

【讨论】:

不幸的是,gmtime() 和 localtime() 只考虑当前的 DST 设置。如果 Windows 的 DST 方法在 20xx 更新,gmtime() 和 localtime() 对于 2007 和 20xx 之间的日期将无效。我已更新问题以说明这一点。 无赖!是的,这让您陷入困境——您想要 Windows DST 更新的某些方面,而不是其他方面。那么我没有想法了——我希望你能找到适合你的东西。

以上是关于在 Windows XP/Server 2003 下将新旧本地时间转换为 UTC的主要内容,如果未能解决你的问题,请参考以下文章

标准用户(XP/Server 2003及以下)如何获取所有运行进程的镜像路径?

为啥 JSON 中 datetime 的行为在不同系统(win xp,server 2003)上有所不同?

windows启动选项(MSDN阅读笔记)

怎么开启 TCP16000端口

MS-08-067 windows smb服务 远程命令执行漏洞

Virtual Box 是啥软件?