Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TimeZoneInfo支持DylightSavingTime没有返回我期望的结果,为什么?_C#_Datetime_Timezone_Dst - Fatal编程技术网

C# TimeZoneInfo支持DylightSavingTime没有返回我期望的结果,为什么?

C# TimeZoneInfo支持DylightSavingTime没有返回我期望的结果,为什么?,c#,datetime,timezone,dst,C#,Datetime,Timezone,Dst,当我开始研究时区时,我觉得这是一项简单的任务,但我越是深入这个话题,就越是迷失方向。 在Stack Overflow中,已经有几十个类似的问题,主要是试图解决特定的问题,但没有一个(包括答案)帮助我理解我想要的主题。 除此之外,正如其他人所问,时不时会出现一些时区变化,微软不得不通过Windows Update发布更新来应对 就我而言,我注意到至少有2个TZ不正确: 阿尔泰标准时间 阿根廷标准时间 因为正如我上面提到的,TZ是从本地系统获取的,我试图搜索更新,但我没有。所以要么我真的错过了一

当我开始研究时区时,我觉得这是一项简单的任务,但我越是深入这个话题,就越是迷失方向。 在Stack Overflow中,已经有几十个类似的问题,主要是试图解决特定的问题,但没有一个(包括答案)帮助我理解我想要的主题。 除此之外,正如其他人所问,时不时会出现一些时区变化,微软不得不通过Windows Update发布更新来应对

就我而言,我注意到至少有2个TZ不正确:

  • 阿尔泰标准时间
  • 阿根廷标准时间
因为正如我上面提到的,TZ是从本地系统获取的,我试图搜索更新,但我没有。所以要么我真的错过了一些重要的东西,要么微软不在乎这两个时区

有关DST/TZ更新的信息 对于,Microsoft有一个明确的政策,并规定:

Microsoft努力将这些更改合并到Windows,并通过Windows update(WU)发布更新。通过WU发布的每个DST/TZ更新将具有最新的时间数据,并将取代之前发布的任何DST/TZ更新

最近的更新可以在专用的

为了帮助自己理解,我创建了一个简单的控制台应用程序(参见下面的代码),问题是这还不够

示例中使用的最重要类和方法概述 假设我的本地TZ是GMT,我们使用DST,输出如下:

TimeZoneInfo.SupportsDaylightSavingTime()

下面的示例检索所有时区的集合 在本地系统上可用,并显示 不支持夏令时

TimezoneInfo.IsDaylightSavingTime(日期时间)

指示指定的日期和时间是否在 当前时区信息时区的夏令时 反对

DateTime.IsDaylightSavingTime()

指示此DateTime实例是否在日光范围内 保存当前时区的时间范围

重要的是要理解(一开始我没有),方法是daylightsavingtimeDateTime的实例上,总是返回请求的信息,同时考虑到本地系统时区

分析输出 关注阿根廷标准时间,我们可以看到时区信息SupportsDaylightSavingTime,返回true,这是一个不正确的信息,因为无论我在哪里搜索它,都会发现相反的结果

即使是对DST的支持也似乎是不正确的,使用C#将UTC日期时间转换为ART TZ总是产生正确的结果

让我觉得我仍然不理解这里的全部情况,是TimeInfo.IsDaylightSavingTime(DateTime)返回false,这正是我所期望的

永久夏令时 根据维基百科 有时提倡采用“永久夏令时”(全年在夏季工作,无需换班),目前在阿根廷、白俄罗斯、[78]加拿大(如萨斯喀彻温省)、冰岛、吉尔吉斯斯坦、马来西亚、摩洛哥、纳米比亚、新加坡、土耳其、土库曼斯坦和乌兹别克斯坦等司法管辖区实施。[164]这可能是遵循邻近地区时区、政治意愿或其他原因的结果

总之,我的开放性问题是:
  • 为什么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