检查TimeSpan是否属于夏令时过渡

时间:2019-07-24 14:16:46

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

我有航班到达时间和航班起飞时间。我必须检查飞行时间是否属于夏令时过渡(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

1 个答案:

答案 0 :(得分: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还会告诉您特定值是否由于日光转换而无效。

您可以使用以下方法将其转换为有效的DateTime:

TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(id);

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

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

编辑here上有一个如何使用GetAdjustmentRules的示例。