Проверить, действует ли летнее время?

Как проверить, вступил ли в силу в Дании переход на летнее время, если да, то добавить к моим данным 1 час, иначе нет? У меня есть xml-файл:

<day = "1"
month = "5"
sunrise ="06:30"
sunset ="21:30"
/>

person Megaoctane    schedule 19.05.2012    source источник


Ответы (8)


Думаю, вам нужно преобразовать этот xml в DateTime, а затем использовать класс TimeZoneInfo.

Если ваше местное время в Дании:

DateTime thisTime = DateTime.Now;
bool isDaylight = TimeZoneInfo.Local.IsDaylightSavingTime(thisTime);

В противном случае вам нужно получить часовой пояс Дании:

DateTime thisTime = DateTime.Now;
// get Denmark Standard Time zone - not sure about that
TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Denmark Standard Time");
bool isDaylight = tst.IsDaylightSavingTime(thisTime);
person Eugene    schedule 19.05.2012
comment
Почему это не работает со стандартным временем Восточной Южной Америки для конкретной new DateTime(1995, 10, 15) даты? Вы не можете проверить это здесь dotnetfiddle.net/ilwIZu и в истории документации по адресу pt.m.wikipedia.org/wiki/ 1995-10-15 действительно дневной свет - person Alexsandro; 21.12.2017

Когда я кодировал, как указано выше - для Нью-Йорка, я обнаружил в отладчике, что время было установлено правильно (включая летнее время)

TimeZoneInfo nyTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

DateTime nyTime = GetLocalDateTime(DateTime.UtcNow, nyTimeZone);

if (nyTimeZone.IsDaylightSavingTime(nyTime))
    nyTime = nyTime.AddHours(1);

public static DateTime GetLocalDateTime(DateTime utcDateTime, TimeZoneInfo timeZone)
    {

        utcDateTime = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Utc);

        DateTime time = TimeZoneInfo.ConvertTime(utcDateTime, timeZone);

        return time;

    }
person Meir Schreiber    schedule 08.08.2013
comment
Что такое GetLocalDateTime? - person Kiquenet; 01.03.2018
comment
Извините, я забыл скопировать метод. Отредактировано выше - person Meir Schreiber; 06.03.2018

Вы можете использовать TimeZoneInfo.IsDaylightSavingTime.

DateTime theDate = new DateTime(2012, 5, 1); // may 1st
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
bool isCurrentlyDaylightSavings = tzi.IsDaylightSavingTime(theDate);
person Matthew    schedule 19.05.2012

Вот общий тест, и я буду рад исправить, если моя математика неверна. В моем случае мне просто нужно было получить смещение по Гринвичу для часового пояса независимо от того, где он находится в мире.

  int timezone;

  TimeZoneInfo localZone = TimeZoneInfo.Local;

  DateTime myTime = DateTime.Now;

  bool isDayLight = TimeZoneInfo.Local.IsDaylightSavingTime(myTime);

  if (isDayLight)
            timezone = Math.Abs(localZone.BaseUtcOffset.Hours) + 1;
  else
            timezone = Math.Abs(localZone.BaseUtcOffset.Hours);

  Debug.WriteLine("timezone is " + timezone);

Я просто находил текущее время и, если оно было в период перехода на летнее время, добавлял +1 к смещению по Гринвичу.

Это работает с Visual Studio Express 2013.

person timv    schedule 13.03.2014

Вам нужно сделать две вещи:

  1. позвони IsAmbiguous
  2. Элемент списка IsDaylightSavingTime.

if (TimeZoneInfo.Local.IsAmbiguousTime(unclearDate) || TimeZoneInfo.Local.IsDaylightSavingTime(unclearDate)) Console.WriteLine("{0} may be daylight saving time in {1}.", unclearDate, TimeZoneInfo.Local.DisplayName);

https://msdn.microsoft.com/en-us/library/bb460642(v=vs.110).aspx

person B.W    schedule 27.04.2017
comment
Что такое IsAmbiguous? - person Kiquenet; 01.03.2018
comment
@Kiquenet Если это правда, вы не можете сказать, только со временем, было ли это летнее время или нет, время существовало как в летнее, так и в стандартное время, например: скажем, летнее время где-то заканчивается 2018-12-23 00:00, Итак, на этом месте 2018-12-22 23:30:00 будет неоднозначно, будет это время DST и в 00:00, часы отстают на 1 час и снова будет это время, теперь стандартное время. - person fbiazi; 22.12.2018

это мое короткое решение, которое можно использовать во всех часовых поясах:

DateTime utcTime = DateTime.Parse("30.10.2018 18:21:34")
DateTime localtime = ConvertUTCToLocalTime(utcTime);


public static DateTime ConvertUTCToLocalTime(DateTime UTCTime)
{
    var localZone = TimeZone.CurrentTimeZone;
    var offset = localZone.GetUtcOffset(UTCTime);
    var localTime = UTCTime.AddHours(offset.Hours);
    return localTime;
}
person Marc    schedule 18.01.2019

Важный

myDateTime.IsDaylightSavingTime ДЕЙСТВИТЕЛЬНО возвращает правильное значение... но... оно точное, по крайней мере, до часа дня, просто передачи даты недостаточно.

Например, в этом году (2019) 10.03.2019 02:00:00 прошло, поскольку myDateTime вернет false, но 10.03.2019 03:00:00 вернет true.

person HellFyr    schedule 08.03.2019

На основе других кодов, приведенных выше, я сделал полный код для запуска и выполнения тестов. Переменная cityTz получает пример имени часового пояса IANA. Шаблон часового пояса IANA используется в Mac и Linux (Windows использует другой стиль часового пояса). В 2020 году переход на летнее время (DST) в Нью-Йорке заканчивается 1 ноября. Если вы протестируете приведенный ниже код, возврат будет FALSE, поскольку дата — 02 ноября, на следующий день после окончания летнего времени. Но если вы измените закомментированную строку и установите дату на 01 ноября (последняя дата перехода на летнее время в Нью-Йорке), возврат будет TRUE.

Вы можете скомпилировать эту программу в терминале Mac или Linux, набрав:

csc testDST.cs

Чтобы запустить вашу программу:

mono testDST.exe

Полный код:

using System;
using System.Collections.Generic;
using System.Linq;

class Program{
    static void Main(string[] args)
    {
        string cityTz;

        //cityTz = "America/Sao_Paulo";
        cityTz = "America/New_York";

        //DateTime theDate = new DateTime(2020, 11, 1); //returns TRUE
        DateTime theDate = new DateTime(2020, 11, 2); //returns FALSE

        Console.WriteLine("Data: "+theDate);

        TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(cityTz);
        bool isDaylight = tzi.IsDaylightSavingTime(theDate);

        Console.WriteLine("isDaylight this date in "+ cityTz +"?: "+ isDaylight);
    }
}
person Marcelo Azambuja    schedule 15.09.2020