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 中的设置)。我首先尝试了我的真实时区(赫尔辛基),结果是:

当切换开关打开时,DynamicDaylightTimeDisabledfalse,但当切换开关关闭时,它变为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

OpenCV之图像均值与高斯模糊

.NET TimeZoneInfo 关于夏令时错误

TimeZoneInfo.ConvertTime在DateTime.MinValue上非常慢

在 unix (nginx) 上托管时 .NET Core 中的 TimeZoneInfo

围绕 utc 日期的问题 - TimeZoneInfo.ConvertTimeToUtc 导致日期更改