3

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

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

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

我向 MS 提出的第一个反问:“编写可靠的 API 有多难?”

然后,实际的问题——你如何做到 100% 的工作?(并且不像 API 所暗示的那样。)

4

2 回答 2

5

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

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

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

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

于 2012-04-16T21:25:45.687 回答
3

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

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

于 2012-04-16T21:32:43.987 回答