为什么此时区会更正夏令时
本文关键字:夏令时 时区 为什么 | 更新日期: 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/Santiago
或America/New_York
),并使用 Noda Time。 使用Noda Time还有许多其他优点。为了回答最后两个问题,创建
dateTime5
和dateTime6
时没有指定DateTimeKind
,因此默认情况下它们具有DateTimeKind.Unspecified
。 然后,当您调用ConvertTime
函数时,根据 MSDN 中的备注,假定该值源自本地时区。需要明确的是,您的代码正在将这些日期从本地时区转换为您指定的时区。
因此,如果这些日期在您的本地时区有效(无论可能是什么),那么它们确实可以转换并且不会引发异常。 如果结果相差一个小时,则意味着您的本地时区与Windows当时认为的圣地亚哥时区相差一个小时。