.NET 8中TimeZoneInfo.ConvertTimeToUtc()在夏令时回退日凌晨12-2点的UTC转换异常问题咨询
.NET 8中TimeZoneInfo.ConvertTimeToUtc()在夏令时回退日凌晨12-2点的UTC转换异常问题咨询
最近处理夏令时转换逻辑时,发现.NET 8里TimeZoneInfo.ConvertTimeToUtc()在夏令时回退日(比如欧洲伦敦时区2026年10月25日)的凌晨12点到2点区间,本地时间转UTC的结果不太对劲,特意来这里跟大家聊聊,也给踩了同个坑的朋友提个醒。
先给大家贴复现代码:
var fallBack = new DateOnly(2026, 10, 25); var tzi = TimeZoneInfo.FindSystemTimeZoneById("Europe/London"); var oneAm = fallBack.ToDateTime(new TimeOnly(1, 0)); var utc = TimeZoneInfo.ConvertTimeToUtc(oneAm, tzi); // 断言失败——按道理夏令时回退在2点开始,此时应该还处于夏令时,结果却不是 Debug.Assert(!tzi.IsDaylightSavingTime(oneAm)); // 断言失败——正确的UTC时间应该是午夜0点,但实际转换结果不是 Debug.Assert(utc.Hour != 0);
最让我困惑的是:在夏令时前进日(spring forward)遇到不存在的本地时间时,TimeZoneInfo.ConvertTimeToUtc()会直接抛出异常,这让我误以为它对夏令时转换日的处理是周全的,没想到回退日会出现这种隐性的错误转换。
目前我已经找到了一个临时的 workaround,把这个问题发出来,一是希望能帮到遇到同样问题的开发者,二是想看看大家有没有更优雅的解决方案。
编辑补充:后来我发现这个问题其实源于自己的理解偏差,但我觉得这个踩坑经历对其他开发者(包括未来的我自己)还是有参考价值的,我会在下面贴出自己的解答。




