You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET/Windows中埃及等时区DST转换差1秒问题咨询

.NET夏令时间隙无效时间问题排查

我们的.NET应用在处理夏令时(DST)间隙导致的无效时间问题时,编写了一套自动将时间调整至间隙后有效时间的代码(未使用Nodatime)。该代码在绝大多数时区下都能正常工作,但在Egypt Standard Time、Pacific SA Standard Time(智利圣地亚哥)和Middle East Standard Time这三个时区出现异常。

涉及时区的调整规则

Egypt Standard Time
   Adjustment rule #10
      Start Date: Wednesday, January 1, 2025
      End Date: Wednesday, December 31, 2025
      Time Change: 1:00 hours
      Annual Start: The Last Thursday of April at 11:59 PM (04/24/2025)
      Annual End: The Last Thursday of October at 11:59 PM

Pacific SA Standard Time
   Adjustment rule #17
      Start Date: Sunday, January 1, 2023
      End Date: Friday, December 31, 9999
      Time Change: 1:00 hours
      Annual Start: The First Saturday of September at 11:59 PM (09/06/2025)
      Annual End: The First Saturday of April at 11:59 PM

Middle East Standard Time
   Adjustment rule #17
      Start Date: Wednesday, January 1, 2025
      End Date: Wednesday, December 31, 2025
      Time Change: 1:00 hours
      Annual Start: The Last Saturday of March at 11:59 PM (03/29/2025)
      Annual End: The Last Saturday of October at 11:59 PM

异常表现

这三个时区的DST开始转换时间为23:59:59,结束转换时间为次日00:59:59,DaylightDelta(间隙时长)均为1小时。但将DST开始转换时间加1小时后转换为UTC时,.NET会抛出如下无效时间异常:

System.ArgumentException: The supplied DateTime represents an invalid time.  For example, when the clock is adjusted forward, any time in the period that is skipped is invalid.

测试代码

TimeZoneInfo.ConvertTimeToUtc(new DateTime(2025, 4, 25, 0, 59, 59),
    TimeZoneInfo.FindSystemTimeZoneById("Egypt Standard Time"));

TimeZoneInfo.ConvertTimeToUtc(new DateTime(2025, 9, 7, 0, 59, 59),
    TimeZoneInfo.FindSystemTimeZoneById("Pacific SA Standard Time"));

TimeZoneInfo.ConvertTimeToUtc(new DateTime(2025, 3, 30, 0, 59, 59),
    TimeZoneInfo.FindSystemTimeZoneById("Middle East Standard Time"));

进一步观察

其他时区的下限(TimeZoneInfo.TransitionTime.DaylightTransitionStart)为包含性,上限(TimeZoneInfo.TransitionTime.DaylightTransitionEnd)为排他性,但这三个时区的上限似乎是包含性的——因为将测试时间加1秒后,UTC转换可正常执行,不会抛出异常。

已知.NET使用的时区信息来自完全更新的Windows 10系统,请问这是Windows时区信息的Bug、.NET的Bug,还是这三个时区的DST间隙上限存在特殊的包含性规则?

注:StackOverflow上《TimeZone Offset is incorrect for "Egypt Standard Time" on Windows 10》的问题未解答本问题,因其涉及不同Windows版本的差异,而本问题发生在同一电脑和Windows版本下。

内容的提问来源于stack exchange,提问作者Matthew Rodatus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:42:21