为什么此时区会更正夏令时

本文关键字:夏令时 时区 为什么 | 更新日期: 2023-09-27 18:35:06

东部标准时间 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,而不是我预期的凌晨 1 点。

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。

为什么此时区会更正夏令时

几件事:

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

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

    • 请参阅时区标签维基,其中有一节标题为"Microsoft时区数据库"。 它描述了它们的工作原理,您可以在注册表中查看它们的详细信息,以及使用它们的优缺点。
  • 智利每年都有不同的夏令时日期。 有关该时期的年度详细信息,请参阅此处。

  • 1990 年,DST 于 9 月 16 日凌晨 12:00 开始。 跳过了从 12:00 到 1:00 AM 的一小时。 不是您建议的 10 月 13 日晚上 11:00 至下午 12:00

  • 如果历史准确性对应用程序很重要,则不要使用 Windows 时区标识符或TimeZoneInfo类。 他们无法胜任这项特定任务。 请改用 IANA 标识符(例如 America/SantiagoAmerica/New_York ),并使用 Noda Time。 使用Noda Time还有许多其他优点。

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

    需要明确的是,您的代码正在将这些日期从本地时区转换为您指定的时区

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