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

C++ 在Windows XP/Server 2003下将新旧本地时间转换为UTC,c++,boost,windows-server-2003,utc,dst,C++,Boost,Windows Server 2003,Utc,Dst,我的应用程序将过去和现在的日期从本地时间转换为UTC 我需要确保在正确处理过去日期的同时,我将遵守任何未来对Windows的DST更新 应用程序采用C++编写,运行在服务器2003上。 我研究过的选项: 因为他们只会遵守当前的DST规则。() A已退出,因为它需要单独的手动更新 因为它需要Vista/Server 2008,所以无法使用 ,但我在寻找更高层次的东西 促进: 类已弃用,并且在操作系统更新时不会更新 类是它的继承者,但它也不尊重操作系统更新 所以 。。。是否有其他人使用原始

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

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

应用程序采用C++编写,运行在服务器2003上。 我研究过的选项:

  • 因为他们只会遵守当前的DST规则。()

  • A已退出,因为它需要单独的手动更新

  • 因为它需要Vista/Server 2008,所以无法使用

  • ,但我在寻找更高层次的东西

  • 促进:

    • 类已弃用,并且在操作系统更新时不会更新
    • 类是它的继承者,但它也不尊重操作系统更新
所以

  • 。。。是否有其他人使用原始注册表解决方案来执行此操作

  • 。。。还有其他建议吗

(编辑:发现)

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

我想我更愿意重新实现
GetTimeZoneInformationForYear
,并可能基于
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows注册表中的信息
GetDynamicTimeZoneInformation
NT\CurrentVersion\时区

这样,您的代码将遵循Windows更新,您可以将脏代码替换为上层平台上的实际实现


因为您不想使用外部数据库,所以我认为没有其他可行的选择

不幸的是,gmtime()和localtime()只遵守当前的DST设置。如果Windows的DST方法在20xx中更新,则gmtime()和localtime()在2007和20xx之间的日期将无效。我已经更新了问题,注意到这一点。糟糕!是的,这让你陷入了困境——你想要Windows DST更新的某些方面,而不是其他方面。那我就没主意了——我希望你能找到适合你的方法。我喜欢用与替代品相同的签名重新实现它的想法,这样当我们转向Server 2008时,本机API就可以成为替代品了。不过,这种策略有(至少:)一个风险。这两个函数是非常新的——如果在它们中发现bug,并且它们以新的格式随时区数据一起更新,那么您的函数可能会被破坏。这似乎不太可能,但在使用“API下”数据时总是有风险的,比如注册表支持时区信息。@kol不,对不起,我还没有实现它。当我回答这个问题时,我已经对Windows时区信息做了足够多的工作,我可能已经做到了,但现在我已经忘记了大部分内容:-)