如何使用 WinAPI 可靠地将本地时间转换为 UTC C++ 在 Windows 计算机上
How to reliably convert local time to UTC on a Windows machine using C++ WinAPI
我需要能够在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函数工作正常。
- Log4cpp:以UTC/GMT时区打印日期
- C++:floor unix时间戳到UTC月份
- std::strftime 在 Windows 中使用 GMTIME 将时区 UTC 显示为 UTC+1
- 提升,以分钟精度获得 UTC 时间
- 从ubuntu上的utc时间计算unix时间
- 为什么 std::p ut_time(std::gmtime 采用 %z 格式返回 +0100 表示 UTC?
- 如何使用闰秒以微秒为单位获取 UTC 时间
- 将具有 DST 的时间字符串转换为 UTC 时间戳
- 使用 std::chrono / date::gps_clock 将双 GPS 时间戳转换为 UTC/tai
- 高效生成 UTC 时间戳
- 如何在C++中以毫秒为单位获取今天的 UTC 午夜时间?
- 有没有办法在 C++ 中获取 uint64_t 日期的 UTC 纳秒
- C 自定义时间日期结构到UTC时期
- 如何将 UTC 时间戳转换为本地时间,即整点后的几秒钟
- 如何从 UTC 时间戳的组件(Y,M,D,H,M,S,MS)创建system_clock::time_point
- 无UTC时区中的正确时间总和
- Windows UTC时间夏令时是否独立
- 将 UTC 时差转换为字符串增强
- 输出boost :: chrono :: system_clock :: time_point作为UTC的本地时间
- 将UTC tm*转换为本地化tm*的跨平台方式