C# 是否启用DST?
在Windows 7的时区设置中,您可以启用或禁用“自动调整夏令时时钟”。如果禁用此功能,则PC时钟将始终显示标准时间,即使时区设置为夏令时之后的时区 这会询问DST是否启用,但答案仅表示当前日期/时间是否在DST规则内,因此应进行调整,但操作系统的设置表示将时间保持在标准时区内C# 是否启用DST?,c#,datetime,dst,C#,Datetime,Dst,在Windows 7的时区设置中,您可以启用或禁用“自动调整夏令时时钟”。如果禁用此功能,则PC时钟将始终显示标准时间,即使时区设置为夏令时之后的时区 这会询问DST是否启用,但答案仅表示当前日期/时间是否在DST规则内,因此应进行调整,但操作系统的设置表示将时间保持在标准时区内 如何从C#获取“夏令时自动调整时钟”如果您只想知道本地时区是否支持DST,请使用: bool hasDST = TimeZoneInfo.Local.SupportsDaylightSavingTime; 在以下任何
如何从C#获取“夏令时自动调整时钟”如果您只想知道本地时区是否支持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
- 调用
会考虑该键中的所有信息TimeZoneInfo.Local
- 通过
查找时区时,除了存储在Id
值中的TimeZoneKeyName
本身之外,不考虑注册表中的任何信息Id
- 通过比较注册表创建的信息和查找的信息,可以确定是否已禁用DST
请注意,.的备注部分也对此进行了详细描述。在该问题中,还有另一个答案显示了如何从注册表获取设置。有什么问题吗?我从来没有听说过一个托管API可以做到这一点。也处理同样的问题Marvel N.-从C#到注册表,好吗?如果这是唯一的解决方案,我会的,但我不想碰注册表。我尝试过的每一个说“只需转到注册表中的此项…”的黑客程序从来都不起作用。@C.Evenhuis-不,它不起作用。甚至都不接近。@MattJohnson你是对的,当我发布我认为排除
CultureInfo
可能会有所帮助时,我注意到的一件糟糕的事情是TimeZoneInfo.Local.SupportsDaylightSavingTime
如果在程序运行时更改了设置,那么它就必须被缓存。使用注册表将获得最新信息。也可以通过WMI获取此信息。@mikez-正确。如果您担心的话,您需要在检查TimeZoneInfo.Local
之前调用TimeZoneInfo.ClearCachedData()
。注册表检查是最直接的方法。如果您可以作为答案发布,我希望看到WMI示例。:)