Определить, включено ли летнее время в настоящее время

Мне нужно найти простой способ узнать, включена ли опция «автоматическая настройка часов для перехода на летнее время» на локальном компьютере. Если опция включена, мне нужно знать, применяется ли она в настоящее время (т. е. в настоящее время в системе летнее время). заранее спасибо


person Nissim    schedule 30.03.2012    source источник


Ответы (4)


Вы можете найти текущий системный часовой пояс по умолчанию и использовать ли он в настоящее время DST (летнее время) следующим образом (начиная с .NET 3.5):

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.");
}
person Jon Skeet    schedule 30.03.2012
comment
Как насчет использования DateTime.IsDaylightSavingTime? - person ABH; 30.03.2012
comment
@hamad: Боже, я такого даже не видел. Лично я не стал бы использовать его, потому что а) он не говорит вам, поддерживает ли текущий часовой пояс переход на летнее время; б) вы действительно задаете вопрос, который логически касается часового пояса в определенный момент времени - гораздо более гибко использовать код, который я представил IMO; c) он не использует ужасный, давайте просто используем системный часовой пояс по умолчанию, неявно аспект DateTime. Я не фанат DateTime по разным причинам... - person Jon Skeet; 30.03.2012

Другим вариантом может быть метод DateTime.IsDaylightSavingTime. Проверьте MSDN.

if (DateTime.Now.IsDaylightSavingTime())
    Console.WriteLine("Daylight Saving");
else
    Console.WriteLine("No Daylight Saving");
person ABH    schedule 30.03.2012

Вы можете прочитать реестр, чтобы определить, установлен ли флажок или нет. Прочтите этот ключ,

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
person Dbadge    schedule 30.03.2012
comment
Это сообщает, включен ли флажок, но не сообщает, действует ли в данный момент летнее время. - person Moby Disk; 13.08.2014
comment
возможно, это то, чего хотят некоторые из нас. Я запускаю отчет, полный дат utc, и если бы я не знал состояние этого флажка и не учитывал его, информация о часовом поясе всегда будет преобразовываться на основе его проверки. - person John Lord; 20.05.2020

Вот еще один пример на С#

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;
}
person Rahbek    schedule 18.04.2016