【问题标题】:Why does this timezone correct the daylight savings time为什么这个时区会更正夏令时
【发布时间】:2016-02-16 21:36:42
【问题描述】:

2016 年东部标准时间的夏令时从 2016 年 3 月 13 日凌晨 2 点开始。此时时钟会调回凌晨 1 点,使凌晨 2 点无效。

此代码块针对 dateTime2 var 报告凌晨 2 点的错误。

TimeZoneInfo timeZoneInfo1;
timeZoneInfo1 = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var dateTime1 = TimeZoneInfo.ConvertTime(new DateTime(2016, 3, 13, 1, 0, 0), timeZoneInfo1);
var dateTime2 = TimeZoneInfo.ConvertTime(new DateTime(2016, 3, 13, 2, 0, 0), timeZoneInfo1);        //Reports invalid date error
var dateTime3 = TimeZoneInfo.ConvertTime(new DateTime(2016, 3, 13, 3, 0, 0), timeZoneInfo1);

但是,在以下时区“太平洋 SA 标准时间”的示例中,1990 年的夏令时开始于 10/13/1990@11pm。这应该使 dateTime4 10/13/1990@11pm 成为无效的日期/时间。

相反,dateTime4 作为有效日期/时间返回。

此外,dateTime5 返回 10/14/1990@1am,自动跳过午夜。

dateTime6 返回 10/14/1990@2am 而不是我预期的 1am。

TimeZoneInfo timeZoneInfo2;
timeZoneInfo2 = TimeZoneInfo.FindSystemTimeZoneById("Pacific SA Standard Time");
var dateTime4 = TimeZoneInfo.ConvertTime(new DateTime(1990, 10, 13, 23, 0, 0), timeZoneInfo2);      //10-14-1990@11pm
var dateTime5 = TimeZoneInfo.ConvertTime(new DateTime(1990, 10, 14, 0, 0, 0), timeZoneInfo2);       //10-14-1990@1am
var dateTime6 = TimeZoneInfo.ConvertTime(new DateTime(1990, 10, 14, 1, 0, 0), timeZoneInfo2);       //10-14-1990@2am

TimeZoneInfo.ConvertTime 有两种工作方式的原因是什么?

我正在使用 VS2010。

【问题讨论】:

    标签: c# timezone


    【解决方案1】:

    一些事情:

    • Pacific SA Standard Time 是具有英文显示名称 (UTC-03:00) Santiago 的 Windows 时区的 ID。那是智利的圣地亚哥。

    • Windows 中此时区的最早条目是 2007 年。它没有 1990 年的数据,因此错误地假设 2007 年之前的任何时间都与 2007 年相同。通常,Microsoft 时区没有广泛的历史。

      • 请参阅timezone tag wiki,其中有一个标题为“Microsoft 时区数据库”的部分。它描述了它们的工作原理,您可以在注册表中的何处查看它们的详细信息,以及使用它们的优缺点。
    • 智利的 DST 日期每年都有变化。 See here for year-to-year details from that period.

    • In 1990, DST started on September 16th at 12:00 AM。从 12:00 到凌晨 1:00 的时间被跳过。不是您建议的 10 月 13 日晚上 11:00 到 12:00。

    • 如果历史准确性对您的应用程序很重要,则不要使用 Windows 时区标识符或 TimeZoneInfo 类。他们不适合那个特定的任务。而是使用 IANA 标识符(例如 America/SantiagoAmerica/New_York),并使用 Noda Time。使用 Noda Time 还有许多其他优点。

    • 为了回答最后两个问题,dateTime5dateTime6 是在未指定 DateTimeKind 的情况下创建的,因此它们默认具有 DateTimeKind.Unspecified。然后,当您调用ConvertTime 函数时,根据in the MSDN 的注释,该值被假定为源自您的本地 时区。

      明确地说,您的代码将这些日期您的本地时区转换为您指定的时区

      因此,如果这些日期在您的 本地 时区(无论可能是什么)中有效,那么它们确实可以转换并且不会引发异常。如果结果相差一个小时,则意味着您的本地时区与 Windows 认为圣地亚哥当时的时区相差一个小时。

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 2013-11-17
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2018-09-08
      • 2012-03-21
      • 2015-08-11
      相关资源
      最近更新 更多