是否启用了DST?

时间:2014-08-12 20:12:18

标签: c# datetime dst

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

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

如何从C#

获取“自动调整夏令时的时钟”

1 个答案:

答案 0 :(得分:3)

如果您只想知道本地时区是否支持DST,请使用:

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本身,这是存储在TimeZoneKeyName值。

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

请注意,the MSDN documentation for TimeZoneInfo.Local的备注部分也详细说明了这一点。