Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否启用DST?_C#_Datetime_Dst - Fatal编程技术网

C# 是否启用DST?

C# 是否启用DST?,c#,datetime,dst,C#,Datetime,Dst,在Windows 7的时区设置中,您可以启用或禁用“自动调整夏令时时钟”。如果禁用此功能,则PC时钟将始终显示标准时间,即使时区设置为夏令时之后的时区 这会询问DST是否启用,但答案仅表示当前日期/时间是否在DST规则内,因此应进行调整,但操作系统的设置表示将时间保持在标准时区内 如何从C#获取“夏令时自动调整时钟”如果您只想知道本地时区是否支持DST,请使用: bool hasDST = TimeZoneInfo.Local.SupportsDaylightSavingTime; 在以下任何

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

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


如何从C#

获取“夏令时自动调整时钟”如果您只想知道本地时区是否支持DST,请使用:

bool hasDST = TimeZoneInfo.Local.SupportsDaylightSavingTime;
在以下任何一种情况下,这都是错误的:

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

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

如果您特别想知道用户是否为通常支持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

    专门检查此值,这也是一个可接受的解决方案

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

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

  • 通过比较注册表创建的信息和查找的信息,可以确定是否已禁用DST


请注意,.

的备注部分也对此进行了详细描述。在该问题中,还有另一个答案显示了如何从注册表获取设置。有什么问题吗?我从来没有听说过一个托管API可以做到这一点。也处理同样的问题Marvel N.-从C#到注册表,好吗?如果这是唯一的解决方案,我会的,但我不想碰注册表。我尝试过的每一个说“只需转到注册表中的此项…”的黑客程序从来都不起作用。@C.Evenhuis-不,它不起作用。甚至都不接近。@MattJohnson你是对的,当我发布我认为排除
CultureInfo
可能会有所帮助时,我注意到的一件糟糕的事情是
TimeZoneInfo.Local.SupportsDaylightSavingTime
如果在程序运行时更改了设置,那么它就必须被缓存。使用注册表将获得最新信息。也可以通过WMI获取此信息。@mikez-正确。如果您担心的话,您需要在检查
TimeZoneInfo.Local
之前调用
TimeZoneInfo.ClearCachedData()
。注册表检查是最直接的方法。如果您可以作为答案发布,我希望看到WMI示例。:)