-1

有一个关于 ToUniversalTime 如何工作的相关问题。但是关于时间转换的相关信息告诉我,过去有时间转换的相关数据库。我的问题是如何ToUniversalTime预测并知道 2070 年 DST 何时更改?

4

1 回答 1

2

我的问题是如何ToUniversalTime预测并知道 2070 年 DST 何时更改?

它不能。它对我们世界各国政府将决定如何处理其时区的未来没有任何特别的见解。

世界上的任何当地时间都是由每个地区根据自己的标准设定的时区规则决定的。由于各种原因,这些原因一直在变化,无论是实际的、政治的还是宗教的。对此没有包罗万象的国际管理机构,也没有他们必须遵守的规则。

在实践中,大多数政府在进行这些更改时往往会给出一些通知。通常,他们至少要离开一年。例如,美国在 2005 年宣布变更将于 2007 年生效。

但情况并非总是如此。例如,2011 年在埃及,夏令时在原定生效前 9 天被取消。

所有这些变化都由我们在计算中使用的两个常见时区数据库跟踪和捕获。您可以在时区标签 wiki中了解这些内容。临时通知的更改意味着每个人都必须争先恐后地获取更新,否则可能会面临数据不准确的风险。

所以回到你问题的核心——在安排未来的活动时,你需要知道预期的上下文是什么。如果它是在 UTC 中提供给您的,那么您可以明确知道它将在什么时间发生(忽略闰秒)。但大多数情况下,您会获得本地时间和时区。如果是未来日期,您必须保留这两个值。您无法预测未来的 UTC 转换而不会有可能发生变化的风险。

只有过了日期,您才能确保转换的稳定性。但是,您如何安排任何事情来实际触发代码中的事件?好吧,一种方法是在接近大致事件时间之前不要尝试进行转换。也许一周的窗口是可以接受的。另一种方法是立即转换所有内容,但保留原始数据。每当您获得更新的时区信息时,您都可以重新计算转换。哎呀,为了安全起见,您可以随时重新计算转换。这仅取决于您的应用程序要求。

顺便说一句,由于这是一个 .NET/C# 问题并且您说您在土耳其,我强烈建议您考虑使用Noda TimeEurope/IstanbulIANA 时区。这只是一个例子:

LocalDateTime ldt = new LocalDateTime(2013, 09, 17, 0, 0);
DateTimeZone tz = DateTimeZoneProviders.Tzdb["Europe/Istanbul"];
ZonedDateTime zdt = ldt.InZoneLeniently(tz);
Instant utc = zdt.ToInstant();
Debug.WriteLine(utc);             // 2013-09-16T21:00:00Z

如果您对 TZDB 对土耳其时间变化的了解程度感兴趣,请查看此处。相比之下,如果您在 Windows 注册表中查看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Turkey Standard Time\Dynamic DST,您会发现 Windows 只知道自 2010 年以来土耳其的变化。

于 2013-09-07T17:57:36.237 回答