【问题标题】:Getting wrong UTC offset hours for exact daylight date准确的夏令时获取错误的 UTC 偏移时间
【发布时间】:2021-02-09 16:19:09
【问题描述】:

我正在尝试像这样获取 EST 时区的特定时间的偏移小时数

var est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
est.GetUtcOffset(new DateTime(2020, 3, 9)).Hours;

这工作正常并返回我-4,这适用于9th March 2020,因为8th March 2020 02:00:00 上的夏令时更改,但是当我尝试为日期8th March 2020 02:00:00 运行相同的代码时,它返回我@987654326 @,虽然我的理解是从 3 月 8 日凌晨 2 点开始它应该开始返回我 -4。

要获得 -4,我必须将它运行到凌晨 3 点,即日光变化后一小时。

但是为什么会这样呢?为什么我必须增加一小时才能使日光更改生效?

【问题讨论】:

  • 因为更改使时钟从凌晨 2 点跳到凌晨 3 点。
  • @juharr - 啊!所以它跳过了日光变化之间的时差!从来不知道这个。所以基本上应该跳过添加/减去白天时间的任何时间以获得正确的偏移量?
  • 是的,基本上凌晨 2 点到凌晨 3 点发生变化时并不存在,因此如果您询问这些时间,它只会给出 -5 偏移量。当它从 -4 变回 -5 时更糟,因为同一小时出现了两次。
  • 知道了!感谢您提供这些有用的信息。您知道任何时区的日光时间是否可以超过一小时?
  • 我不知道它在任何地方都超过一个小时,但我认为有些地方会改变半小时,而时区内的一些地方根本不会改变。

标签: c# timezone


【解决方案1】:

来自the TimeZoneInfo.GetUtcOffset docs备注部分:

... 如果dateTime 不明确,或者转换后的时间不明确,则此方法将不明确的时间解释为标准时间。如果dateTime无效,该方法返回一个TimeSpan对象,反映UTC与时区标准时间的差异。

日期时间2020-03-08 02:00:00 在美国东部时区无效,因为当天时钟从 01:59:59 提前到 03:00:00。因此,GetUtcOffset 使用其描述的返回标准时间 偏移量的行为。如果您首先调用TimeZoneInfo.IsInvalidTime,您可以检测到这一点。

您可能还想使用TimeZoneInfo 中的其他方法来应用特定行为。例如,在约会安排场景中通常希望使用我在ToDateTimeOffset 扩展方法in this other answer 中提出的行为。

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2013-10-17
    • 2020-07-16
    • 2017-03-26
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多