【问题标题】:Is DST enabled?是否启用了夏令时?
【发布时间】:2014-10-06 01:15:41
【问题描述】:

在 Windows 7 的时区设置中,您可以启用或禁用“自动调整夏令时时钟”。如果禁用此功能,则 PC 时钟将始终显示标准时间,即使时区设置为遵循夏令时的时区。

这个question 询问是否启用 DST,但答案仅说明当前日期/时间是否在 DST 规则范围内,因此应进行调整,但操作系统的设置表示将时间保持在标准中时区。

如何从 C# 获取“自动调整夏令时时钟”

【问题讨论】:

  • 在那个问题中,还有另一个答案显示了如何从注册表中获取设置。这有什么问题吗?我从未听说过使用托管 API 来实现这一点。
  • stackoverflow.com/questions/1252314/… 也处理同样的问题
  • Marvel N. - 从 C# 进入注册表好吗?如果这是唯一的解决方案,我会这样做,但我宁愿不碰注册表。我尝试过的每一个黑客都说“只需转到注册表中的这个键......”从来没有奏效。
  • @C.Evenhuis - 不,它没有。甚至没有关闭。
  • @MattJohnson 你说得对,当我发帖时我认为排除CultureInfo 的可能性会有所帮助,我的错

标签: c# datetime dst


【解决方案1】:

如果你只想知道当地时区是否支持夏令时,使用:

bool hasDST = TimeZoneInfo.Local.SupportsDaylightSavingTime;

这在以下任何一种情况下都是错误的:

  • 所选时区不使用夏令时(如亚利桑那和夏威夷)

  • 所选时区使用 DST,但用户已清除“自动调整夏令时时钟”复选框。

如果您特别想知道用户是否在通常支持的时区禁用 DST,请执行以下操作:

bool actuallyHasDST = TimeZoneInfo.Local.SupportsDaylightSavingTime;
bool usuallyHasDST = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)
                                 .SupportsDaylightSavingTime;
bool dstDisabled = usuallyHasDST && !actuallyHasDST;

dstDisabled 变量只有在用户明确清除“自动调整夏令时时钟”复选框时才会为真。如果该框不存在,因为该区域不支持以 DST 开头,则 dstDisabled 将为 false。

这是如何工作的?

  • Windows 将所选时区设置存储在注册表中:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
    
  • 清除该框后,DynamicDaylightTimeDisabled 键设置为 1。否则设置为0

    One of the answers in the other question you mentioned专门检查了这个值,这也是一个可以接受的解决方案。

  • 调用TimeZoneInfo.Local 会考虑该密钥中的所有信息。

  • 通过Id 查找时区考虑注册表中的任何信息,除了Id 本身,它存储在@ 987654334@值。

  • 通过将注册表创建的信息与查找的信息进行比较,您可以确定 DST 是否已被禁用。

注意,这在the MSDN documentation for TimeZoneInfo.Local的备注部分也有很好的描述。

【讨论】:

  • 我注意到的一件事是,如果在程序运行时更改了设置,TimeZoneInfo.Local.SupportsDaylightSavingTime 并没有改变,所以它必须被缓存。使用注册表将获得最新信息。也可以通过 WMI 获得。
  • @mikez - 正确。如果您对此感到担忧,则需要在检查TimeZoneInfo.Local 之前致电TimeZoneInfo.ClearCachedData()。注册表检查是最直接的方法。如果您可以发布作为答案,我很乐意看到 WMI 示例。 :)
猜你喜欢
  • 2010-10-19
  • 2013-01-21
  • 2023-03-18
  • 2018-09-19
  • 2011-07-26
  • 2012-07-03
  • 2014-10-27
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多