【问题标题】:Check if TimeSpan falls in Daylight Saving transition检查 TimeSpan 是否属于夏令时过渡
【发布时间】:2019-12-02 17:38:10
【问题描述】:

我有航班到达时间和航班起飞时间。我必须检查飞行时间是否属于夏令时过渡(Equinox Transition)。如果时间提前,我需要增加一个小时的飞行时间,否则如果时间恢复,我需要从飞行时间中减去一个小时。

TimeZoneInfo 类中,我们确实有IsDaylightSavingTime,但它只说明时间是否处于夏令时。

我需要检查我的时间跨度是否受到夏令时转换的影响。

Update1:在 3 月和 11 月观察到过渡,但日期每年都在变化,因此我无法对任何日期进行硬编码。我需要获取 EQUINOX 发生年份的具体日期。

Update2:日期时间是本地时间,而不是 UTC,因为航班到达和离开都来自同一个机场。

数据: 航班起飞时间:2019年3月19日23:00
航班到达时间:2019年3月20日08:00
飞行时间:7 小时,但由于 EQUINOX,它是 8 小时,因为时间提前了
2019年3月20日05:58

【问题讨论】:

  • 出发和到达时间使用UTC,然后分别转换为当地时间。
  • 使用 NodaTime 来做这件事怎么样?在两个ZonedDateTimes 之间获取Duration 应该很简单。
  • @ElmoDev001 我需要检查今年 EQUINOX 何时发生,然后我必须检查我的时间跨度是否处于初始状态。
  • 如果你能用样本数据来具体化,那真的很有帮助。例如,我们不知道您的出发和到达时间是 本地 时间(可能不明确)还是 UTC(不能)。请注意,如果您只有当地时间,那么如果您离开或到达一个不明确的时间(在回退过渡期间),您无论如何都会丢失数据。请注意,夏令时转换通常不会发生在精确的春分 - 我会避免提及春分,除非这对您的问题非常重要,否则会令人困惑。
  • @Jackboys:不,这不安全。如果航班在 1:20 起飞并在 1:40 到达,则可能是 20 分钟或 80 分钟。从根本上说,如果一年中只有两个小时的当地时间,那么这些时间是模棱两可的。您正在丢失信息 - 就这么简单。

标签: c# asp.net .net-core timespan


【解决方案1】:

GetAdjustmentRules 为您提供您正在寻找的信息:

提供有关时区调整的信息,例如夏令时的转换。

以上链接中示例代码的输出示例:

W. Europe Standard Time Adjustment rules  
Start Date: Monday, January 01, 0001  
End Date: Friday, December 31, 9999  
Time Change: 1:00 hours  
Annual Start: The Last Sunday of March at 2:00 AM  
Annual End: The Last Sunday of October at 3:00 AM  

IsInvalidTime 还会告诉您特定值是否因日光转换而无效。

您可以使用以下方法将其转换为有效的日期时间:

TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(id);

if (timeZone.IsInvalidTime(dateTime))
    dateTime = TimeZoneInfo.ConvertTime(dateTime.ToUniversalTime(), timeZone);

最后,我的建议是将 DateTime 存储和评估为 UTC 以避免歧义。您可以将其转换为本地时间,仅用于 GUI 目的。

编辑:here 是否有一个如何使用 GetAdjustmentRules 的示例。

【讨论】:

  • 感谢您的输入,我检查了函数,但它返回的数据不正确,因为我的数据类似于{System.TimeZoneInfo.AdjustmentRule} DateEnd: {12/31/2006 00:00:00} DateStart: {01/01/0001 00:00:00} DaylightDelta: {01:00:00} DaylightTransitionEnd: {System.TimeZoneInfo.TransitionTime} DaylightTransitionStart: {System.TimeZoneInfo.TransitionTime}
  • 我要获取当年的夏令时过渡日期时间
  • 看看 DaylightTransitionStart 结构的内部。您有月、周和 DayOfWeek。所有数据都在那里,您只需将各个部分放在一起即可。
  • 在您的第一条评论中,您正在查看过去的日光标准,有效期至 2006 年 12 月 31 日。数组中可能还有其他 AdjustmentRule。
  • 看看这个问题,这里有一个如何使用GetAdjustmentRules的例子stackoverflow.com/questions/29981072/…
猜你喜欢
  • 2012-05-26
  • 2013-12-23
  • 2018-08-01
  • 2018-01-12
  • 1970-01-01
  • 2021-02-17
  • 2012-06-26
  • 2013-11-25
  • 2017-08-12
相关资源
最近更新 更多