检测当前是不是启用 DST
Posted
技术标签:
【中文标题】检测当前是不是启用 DST【英文标题】:Detect if the DST is currently enabled检测当前是否启用 DST 【发布时间】:2012-04-13 20:12:18 【问题描述】:我需要找到一种简单的方法来了解本地计算机的“自动调整夏令时时钟”选项是否已启用。 如果该选项打开,我需要知道它当前是否已应用(即系统中当前是否为 DST)。 提前致谢
【问题讨论】:
【参考方案1】:您可以像这样(.NET 3.5 以上)找到当前系统默认时区以及当前是否使用 DST(夏令时):
TimeZoneInfo zone = TimeZoneInfo.Local;
if (zone.SupportsDaylightSavingTime)
Console.WriteLine("System default zone uses DST...");
Console.WriteLine("In DST? 0", zone.IsDaylightSavingTime(DateTime.UtcNow));
else
Console.WriteLine("System default zone does not use DST.");
【讨论】:
使用 DateTime.IsDaylightSavingTime 怎么样? @hamad:天哪,我从来没见过。我个人不会使用它,因为 a) 它没有告诉你当前时区是否支持 DST; b)您实际上是在问一个在逻辑上与特定时间点的时区有关的问题-使用我在IMO提供的那种代码要灵活得多; c) 它没有使用DateTime
的可怕的“让我们隐式地使用系统默认时区”方面。我不是DateTime
的粉丝,出于各种原因...【参考方案2】:
另一个选项可能是DateTime.IsDaylightSavingTime
方法。检查MSDN。
if (DateTime.Now.IsDaylightSavingTime())
Console.WriteLine("Daylight Saving");
else
Console.WriteLine("No Daylight Saving");
【讨论】:
【参考方案3】:您可以读取注册表以确定复选框是否被选中。 读这把钥匙,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation DynamicDaylightTimeDisabled
= 0 或 1(禁用)
类似:
Dim retval As Object = Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation", "DynamicDaylightTimeDisabled", 0)
If retval IsNot Nothing Then
Select Case CInt(retval)
Case 0
Trace.WriteLine("Automatically adjust clock for Daylight Saving Time is checked")
Case 1
Trace.WriteLine("Automatically adjust clock for Daylight Saving Time is NOT checked")
End Select
End If
【讨论】:
这告诉复选框是否启用,但不告诉 DST 当前是否有效。 也许这就是我们中的一些人想要的。我正在运行一个包含 utc 日期的报告,如果我不知道该复选框的状态并考虑它,timezoneinfo 将始终根据它被检查来转换。【参考方案4】:这是另一个 C# 示例
private static bool IsDayLightSavingsEnabled()
try
var result = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation", "DynamicDaylightTimeDisabled", 1);
return !Convert.ToBoolean(result); //0 - Checked/enabled, 1 - Unchecked/disabled
catch
return false;
【讨论】:
以上是关于检测当前是不是启用 DST的主要内容,如果未能解决你的问题,请参考以下文章