gpt4 book ai didi

c# - 为什么这个时区更正夏令时

转载 作者:太空宇宙 更新时间:2023-11-03 21:14:23 25 4
gpt4 key购买 nike

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

此代码块报告 dateTime2 变量的凌晨 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);

但是,在下面的时区示例“Pacific SA Standard Time”中,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 时区没有悠久的历史。

    • 查看 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 .使用野田时间还有许多其他优势。

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

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

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

关于c# - 为什么这个时区更正夏令时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35443479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com