TimeZoneInfo.ConvertTimeFromUtc не преобразует старые даты в летнее время

На этот вопрос уже есть ответ здесь:

Всего 2 ответа


Вы используете неправильный часовой пояс. "E. Australia Standard Time" соответствует времени в Брисбене, и этот часовой пояс не соответствует летнему времени, поэтому зимнее и летнее время возвращаются с одинаковым смещением UTC.

Для Сиднея вам нужно использовать "AUS Eastern Standard Time" . ConvertTimeFromUtc применит смещение UTC, соответствующее данному часовому поясу, и даст вам ожидаемое время.

Вот ваш фрагмент, включая использование соответствующего часового пояса и небольшую правку по инициализации часового пояса, поэтому он скомпилирован:

    public void ConvertTimes()
    {
        string Timezone = "AUS Eastern Standard Time";

        TimeZoneInfo ESTZone = TimeZoneInfo.FindSystemTimeZoneById(Timezone);
        DateTime date = Convert.ToDateTime("2019-01-23 13:15:23.6090752");
        DateTime SydneyDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
        string EST = SydneyDateTime.ToString() + " / " + SydneyDateTime.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime) + " / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;
        DateTime IndiaDateTime = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));


        DateTime date2 = Convert.ToDateTime("2019-05-23 13:15:23.6090752");
        DateTime SydneyDateTime2 = TimeZoneInfo.ConvertTimeFromUtc(date2, TimeZoneInfo.FindSystemTimeZoneById(Timezone));
        string EST2 = SydneyDateTime2.ToString() + " / " + SydneyDateTime2.IsDaylightSavingTime().ToString() + " / " + ESTZone.IsDaylightSavingTime(SydneyDateTime2) + " / " + ESTZone.DaylightName + " / " + ESTZone.StandardName;
    }

Это дает вывод:

EST = "24/01/2019 00:15:23 / False / True / AUS по восточному поясному времени / AUS по восточному поясному времени"

EST2 = "23/05/2019 23:15:23 / True / False / AUS по восточному поясному времени / AUS по восточному поясному времени"

что я думаю, это то, что вы ожидали.

Кстати, DateTime.IsDaylightSavingTime () использует ваш местный часовой пояс, чтобы определить, находится ли время в летнее время. Это может вводить в заблуждение, глядя на это здесь.


Похоже, что .Net не считает AEST часовым поясом, в котором используется летнее время. Если я запускаю приведенный ниже код, вывод показывает, что CEST - это летнее время, а AEST - нет:

    string timezone1 = "E. Australia Standard Time";
    string timezone2 = "Central European Standard Time";
    TimeZoneInfo info1 = TimeZoneInfo.FindSystemTimeZoneById(timezone1);
    TimeZoneInfo info2 = TimeZoneInfo.FindSystemTimeZoneById(timezone2);
    DateTime date = Convert.ToDateTime("2019-05-23 13:15:23.6090752");
    DateTime datetime1 = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(timezone1));
    DateTime datetime2 = TimeZoneInfo.ConvertTimeFromUtc(date, TimeZoneInfo.FindSystemTimeZoneById(timezone2));
    var isDaylight1 = info1.IsDaylightSavingTime(datetime1);
    var isDaylight2 = info2.IsDaylightSavingTime(datetime2);
    Console.WriteLine(isDaylight1);
    Console.WriteLine(isDaylight2);

Согласно www.timeanddate.com , летнее время в этом регионе не является обязательным:

В некоторых местах наблюдается летнее время / летнее время, и поэтому летом используется AEDT (восточное летнее время Австралии).


Есть идеи?

10000