На этот вопрос уже есть ответ здесь:
Всего 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 (восточное летнее время Австралии).