在 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)上有所不同?