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