为何夏令时切换后TimeZoneInfo.DisplayName的UTC偏移未改变?
问题
上周我编写了一段测试代码,用于了解.NET Framework 4.8.1中TimeZoneInfo类及GetSystemTimeZones()返回的属性值。上周末欧洲多国切换至英国夏令时(British Summer Time),如今运行相同代码:
var zones = TimeZoneInfo.GetSystemTimeZones().OrderBy(z => z.Id); foreach (TimeZoneInfo zone in zones) { Console.WriteLine(zone.Id); Console.WriteLine(" " + zone.DisplayName); Console.WriteLine(" " + zone.DaylightName); Console.WriteLine(); }
得到的结果与上周略有不同:
GMT Standard Time (UTC+00:00) Dublin, Edinburgh, Lisbon, London GMT Summer Time
我注意到TimeZoneInfo.DaylightName已切换为GMT Summer Time(上周应为GMT Standard Time),但困惑的是,夏令时偏移调整后,(UTC+00:00) Dublin, Edinburgh, Lisbon, London为何没有变为(UTC+01:00)?我正在为用户界面开发时区选择器,担心TimeZoneInfo.DisplayName会造成用户混淆。
回答
这是Windows时区数据库的设计特性:TimeZoneInfo.DisplayName中的UTC偏移始终对应时区的标准时间偏移,不会随夏令时的切换而改变,它的作用是标识时区的基础偏移属性,而非当前实际生效的偏移值。
如果你的时区选择器需要展示当前实际生效的UTC偏移,不能直接依赖DisplayName,需要自行计算并拼接:
- 调用
TimeZoneInfo.GetUtcOffset(DateTime.Now)获取当前时区的实际偏移量 - 将该偏移量与时区名称组合成用户易懂的文本,例如
(UTC+01:00) Dublin, Edinburgh, Lisbon, London (夏令时)
另外需要注意,TimeZoneInfo.Id(如示例中的GMT Standard Time)是系统内部的唯一稳定标识,做时区存储或业务逻辑处理时,建议优先使用这个值,不要依赖DisplayName或DaylightName这类可能随系统设置或时区规则变化的属性。
内容的提问来源于stack exchange,提问作者EvilDr
相关产品推荐
相关产品推荐

