C# TimeZoneInfo支持DylightSavingTime没有返回我期望的结果,为什么?
当我开始研究时区时,我觉得这是一项简单的任务,但我越是深入这个话题,就越是迷失方向。 在Stack Overflow中,已经有几十个类似的问题,主要是试图解决特定的问题,但没有一个(包括答案)帮助我理解我想要的主题。 除此之外,正如其他人所问,时不时会出现一些时区变化,微软不得不通过Windows Update发布更新来应对 就我而言,我注意到至少有2个TZ不正确:C# TimeZoneInfo支持DylightSavingTime没有返回我期望的结果,为什么?,c#,datetime,timezone,dst,C#,Datetime,Timezone,Dst,当我开始研究时区时,我觉得这是一项简单的任务,但我越是深入这个话题,就越是迷失方向。 在Stack Overflow中,已经有几十个类似的问题,主要是试图解决特定的问题,但没有一个(包括答案)帮助我理解我想要的主题。 除此之外,正如其他人所问,时不时会出现一些时区变化,微软不得不通过Windows Update发布更新来应对 就我而言,我注意到至少有2个TZ不正确: 阿尔泰标准时间 阿根廷标准时间 因为正如我上面提到的,TZ是从本地系统获取的,我试图搜索更新,但我没有。所以要么我真的错过了一
- 阿尔泰标准时间
- 阿根廷标准时间
- 为什么TimezoneInfo.SupportsDaylightSavingTime()返回true而TimeInfo.IsDaylightSavingTime(DateTime)返回false
- 除了上面解释的内容外,我如何确保我拥有来自Microsoft的最新DST/TZ更新
- 简短回答
TimeZoneInfo.SupportsDaylightSavingTime
考虑系统上可用的所有时区数据,而不仅仅是当年的时区数据。阿根廷标准时间
和阿尔泰标准时间
都有DST生效的时间段,在Windows为其跟踪的时间段内
更长的答案
TimeZoneInfo.SupportsDaylightSavingTime
(您在问题中已经链接到)的文档说明:
获取一个值,该值指示时区是否有任何夏令时规则
不太清楚的是,它具体指的是TimeZoneInfo.AdjustmentRule
对象,由TimeZoneInfo.GetAdjustmentRules
方法返回,这些是系统上的所有规则,而不仅仅是当年的规则
Microsoft策略声明Windows将跟踪2010年以后的所有更改。
但是,某些时区(例如阿根廷)在编写策略之前已经在跟踪更改,因此在某些情况下,您将看到早期的数据
在Windows注册表中,您可以通过以下键找到系统知道的所有时区数据:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
每个TimeZoneInfo.Id
值对应于该值下的一个子项,调整规则(如果有)将位于该子项下的Dynamic DST
下
对于阿根廷标准时间\动态DST
,我们可以找到2006年到2010年的数据
即使不解码数据,我们也可以看到不同年份之间的差异。通过观察,我们了解到了以下细节:
夏令时似乎在2007-08年和2008-09年夏季生效。(阿根廷位于南半球,夏季分为两年
var zones = TimeZoneInfo.GetSystemTimeZones();
foreach(TimeZoneInfo zone in zones)
{
if (! zone.SupportsDaylightSavingTime)
Console.WriteLine(zone.DisplayName);
}
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones