TimeZoneInfo DST 与 Windows 设置
Posted
技术标签:
【中文标题】TimeZoneInfo DST 与 Windows 设置【英文标题】:TimeZoneInfo DST vs Windows settings 【发布时间】:2018-10-19 16:19:59 【问题描述】:TimeZoneInfo.SupportsDaylightSavingTime 是否反映了 Windows 日期和时间设置中“自动调整夏令时”的禁用/启用状态?
我正在尝试在用户无法访问 Windows 的信息亭模式应用程序中复制这些设置,并且我已经设法让一切正常工作,包括使用 tzutil 设置带或不带 DST 的时区,但在测试时我注意到一些时区 DST 设置(如莫斯科)与 Windows 不同步。
我们知道俄罗斯几年前取消了 DST,所以当我转到 Windows 并选择莫斯科作为我的时区时,我看到了:
在启动我的测试控制台应用程序 (.NET 4.6.1) 时,然后从 GetSystemTimeZones 获取我当前的时区,我发现它确实支持 DST:
如果 SupportsDaylightSavingTime 为 true,是否应该在 Windows 设置中启用切换开关?
我什至通过调用 Win32 函数 GetDynamicTimeZoneInformation 来检查 DynamicDaylightTimeDisabled 是真还是假(尽管我不完全确定这是否反映了 Windows 中的设置)。我首先尝试了我的真实时区(赫尔辛基),结果是:
当切换开关打开时,DynamicDaylightTimeDisabled为false,但当切换开关关闭时,它变为true。所以我假设它可能确实反映了它?
我在俄罗斯试过,DynamicDaylightTimeDisabled 的值为 false,所以启用了日光?
如果有帮助的话,我的 Windows 版本是 10.0.17134 Build 17134。
我对此感到非常困惑,非常感谢一些帮助。谢谢!
【问题讨论】:
这是一个很好的问题。希望你能找到答案。 看看.m_adjustmentRules
。可以看到,2014年后没有调整规则生效。
感谢 glenebob,您的评论让我找到了正确的答案。我应该阅读更多关于这些调整规则的内容!
【参考方案1】:
正如 glenebob 在他的评论中指出的那样,原因是在 2014 年之后没有生效的调整规则,当时俄罗斯决定不再使用 DST。
俄罗斯时区确实支持 DST,但只在 2014 年之前,所以我真正要做的就是打电话给TimeZoneInfo.GetAdjustmentRules 以确定 DST 在这个时间点是否有效.
我正在开发的应用程序也在使用 UWP API,它实际上缺少这种方法,但这是一个完全不同的问题......
我在那里大肆追逐了一段时间......我们生活和学习......
更新:我决定不通过检查调整规则来复制 Windows。太多的努力和复杂性的价值不大。不用了!
【讨论】:
是的,你是对的。如果曾经有任何调整规则,TimeZoneInfo.SupportsDaylightSavingTime
将为真。关于DynamicDaylightTimeDisabled
,仅当时区在当前 年发生转换并且用户已专门将切换开关设置为关闭时才会为真。此外,如果您愿意,您可以在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
检查注册表中的此值
哦,在图片中,您似乎正在匹配 StandardName
。不要那样做——那些会被本地化。请改用Id
属性。您也可以只使用 FindSystemTimeZoneById
而不是 LINQ。此外,请勿使用TimeZone.CurrentTimeZone
。使用TimeZoneInfo.Local
。以上是关于TimeZoneInfo DST 与 Windows 设置的主要内容,如果未能解决你的问题,请参考以下文章
TimeZoneInfo.ConvertTime在DateTime.MinValue上非常慢