TimeZoneInfo类是否支持识别历史及变更后的夏令时规则?
TimeZoneInfo.IsDaylightSavingTime 对夏令时规则变动的处理逻辑 这个方法的判断结果完全依赖运行环境本地存储的时区规则数据,本身不会动态联网拉取最新政策,具体行为可以拆成以下几点:
- 不同运行环境的时区数据源不同:Windows环境读取系统注册表中微软维护的时区数据,Linux/macOS环境默认读取系统安装的IANA tzdata时区数据库,.NET也支持嵌入固定版本的时区数据随应用分发。所有官方维护的时区数据源都会完整记录对应时区所有历史生效过的夏令时规则,以及已经正式立法公布的未来生效规则。
- 只要你当前环境的时区数据已经更新到包含对应规则变动的版本,方法会自动按时间维度匹配对应时段的规则,不会用一套固定规则套所有日期:
- 规则生效日之前的历史日期,严格按照当时实际执行的旧规则判断是否属于夏令时
- 规则生效日之后的日期,按照新规则判断:如果政策是永久废止夏令时,后续所有日期都会返回
false;如果政策是永久执行夏令时,后续所有日期都会返回true
- 存在两个明确的边界限制:
- 如果新的夏令时政策已经公布,但你运行环境的时区数据没有同步更新(比如未安装Windows系统更新、Linux环境未升级tzdata包、应用内嵌的时区数据版本过旧),方法不会自动适配未录入的新规则,判断结果会和实际政策存在偏差
- 对于尚在提案阶段、未正式完成立法落地的规则变动,时区数据源不会提前录入,方法自然也无法预判未正式生效的政策
针对你提到的美国永久夏令时法案的场景:只要该法案正式落地生效,且你环境的时区数据更新到了收录该规则的版本,IsDaylightSavingTime对该时区2023年11月之后的日期会持续返回true,不会再按旧规则判断每年有半年处于非夏令时状态,同时该日期之前的历史日期判断不会受新规则影响,仍然和历史实际执行情况一致。
如果你是通过自定义规则创建的TimeZoneInfo实例,而非读取系统预设时区,上述逻辑不适用,判断结果完全取决于你创建实例时传入的自定义夏令时规则。
内容的提问来源于stack exchange,提问作者Tester Bill
相关产品推荐
相关产品推荐

