是否启用夏令时

本文关键字:夏令时 启用 是否 | 更新日期: 2023-09-27 18:17:38

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

这个问题问是否启用夏令时,但答案只说当前日期/时间是否在夏令时规则内,所以应该调整,但操作系统的设置说要保持在标准时区的时间。

如何从c#中获得"自动调整夏令时时钟"

是否启用夏令时

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

bool hasDST = TimeZoneInfo.Local.SupportsDaylightSavingTime;

在以下任何一种情况下都为假:

  • 选择的时区不使用夏时制(如亚利桑那和夏威夷)

  • 选择的时区使用夏令时,但用户已经清除了"自动调整时钟为夏令时"复选框。

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

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

    您提到的另一个问题中的一个答案专门检查了此值,这也是一个可接受的解决方案。

  • 调用TimeZoneInfo.Local将考虑该键中的所有信息。

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

  • 通过比较注册表中创建的信息和查找到的信息,可以判断夏令时是否被关闭。

请注意,这在TimeZoneInfo.Local的MSDN文档的注释部分也有很好的描述。