有一个相关问题about how ToUniversalTime works。但是有关时间转换的相关信息告诉我,过去有时间转换的相关数据库。我的问题是ToUniversalTime
如何预测并知道2070年的DST变化何时会出现?
答案 0 :(得分:2)
我的问题是
ToUniversalTime
如何预测并知道2070年的DST变化何时会出现?
它不能。它对我们世界各国政府将决定如何处理其时区的未来没有任何特别的了解。
世界上任何本地时间都取决于每个地区按照自己的标准设置的时区规则。这些因各种原因而变化,无论是实际的,政治的还是宗教的。没有包罗万象的国际管理机构,也没有任何必须遵守的规则。
在实践中,大多数政府倾向于在进行这些更改时提供某些通知。通常情况下,他们至少需要一年的时间。例如,改变的美国announced in 2005将于2007年生效。
但情况并非总是如此。例如,in Egypt in 2011,夏令时在计划生效前9天被取消。
我们在计算中使用的两个常见时区数据库会跟踪和捕获所有这些更改。您可以在the timezone tag wiki中了解这些内容。短信通知意味着每个人都必须争先恐后地抢购更新,或者冒着数据不准确的风险。
回到问题的核心 - 在安排未来事件时,您需要知道预期的上下文是什么。如果它是以给你给你的,那么你可以明确地知道它将在什么时间发生(忽略leap seconds)。但大部分时间你都会获得当地的时间和时区。如果它是未来的日期,您必须保留这两个值。如果没有可能发生变化的风险,您无法预测未来的UTC转换。
只有在日期过去后才能确保转换的稳定性。但是,你如何安排任何实际触发代码中的事件?好吧,一种方法是在你接近大概的事件时间之前不要尝试进行转换。也许一个星期的窗口是可以接受的。另一种方法是立即转换所有内容,但保留原始数据。每当您获得更新的时区信息时,您都可以重新计算转换。哎呀,你可以随时重新计算转换,只是为了安全起见。这取决于您的应用要求。
顺便说一下,由于这是一个.NET / C#问题而你说你在土耳其,我强烈建议你考虑使用Noda Time和Europe/Istanbul
IANA时区。这只是一个例子:
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对土耳其时间变化了解多少感兴趣,look here。相比之下,如果您在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Turkey Standard Time\Dynamic DST
查看Windows注册表,您将看到Windows自2010年以来只知道土耳其的变化。