如何使用 WinAPI 可靠地将本地时间转换为 UTC C++ 在 Windows 计算机上

How to reliably convert local time to UTC on a Windows machine using C++ WinAPI

本文关键字:C++ UTC 计算机 Windows 转换 时间 WinAPI 何使用      更新时间:2023-10-16

我需要能够在Windows机器上将本地时间转换为UTC。我找到了声称可以做到这一点的SystemTimeToTzSpecificLocalTime API,但后来我阅读了它的描述并发现了这个:

在下列情况下,SystemTimeToTzSpecificLocalTime 函数可能会错误地计算本地时间:

  • 时区对旧年份和新年份使用不同的 UTC 偏移量。
  • 要转换的 UTC 时间和计算的本地时间是不同的年份。

我对MS的第一个反问,"编写一个可靠的API有多难?

然后,实际的问题 - 你如何在100%的时间内做到这一点?(而不是像那个 API 建议的那样。

这两个问题的答案都是基本上是不可能的。这是计算机科学人员倾向于讨厌处理本地时间的原因之一。

以下是一些令人困惑的问题示例:当我们从 2:00 跳回一个小时到 1:00 时,有两个 1:30。我们今天也无法知道十年后的夏令时规则(如果有的话)会是什么。时区边界有时会移动,因此仅知道您今天使用的是太平洋时间可能不足以告诉我们您的时区偏移量在 85 年前是多少。今天没有办法知道将来可能会或可能不会插入闰秒。

如果您发现自己处于可能的情况,则必须在特定情况下进行编码,以使这些操作在您的特定情况下成为可能。提供的操作是通用的,提供"通常正确"的结果,而不会限制可以使用它们的情况。

道德:除显示外,不要使用本地时间。即便如此,将过去或未来的时间转换为当地时间也是有问题的。

由于 DST 周期有时会在某些领域发生变化,因此很难写出在过去和未来所有情况下都正确的内容。

尽管如此,我需要此功能,我建议使用 C 函数(本地时间、mktime、...)。 我最近遇到了一个问题,Windows函数SystemTimeToTzSpecificLocalTime在Citrix服务器上无法正常工作(Citrix在时区方面做了一些奇怪(但高级)的事情),但C函数工作正常。