Неверный результат при использовании TimeZoneInfo.ConvertTime () для получения локализованной даты и времени - PullRequest
0 голосов
/ 24 октября 2018

У меня очень простая задача, а TimeZoneInfo.ConvertTime() дает неверный результат.Я просто хочу найти текущую дату и время в часовом поясе Австралии.

string timeZone = "Cen. Australia Standard Time";
TimeZoneInfo zoneID = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
DateTime nowAtTimeZone = TimeZoneInfo.ConvertTime(DateTime.UtcNow, zoneID);
// result:           24/10/2018 7:43:29 PM
// actual ACST time: 24/10/2018 6:43:29 PM (this is what I want)
// actual ACDT time: 24/10/2018 7:43:29 PM (this is not what I want)

Я получил реальное время ACST отсюда: https://www.timeanddate.com/time/zones/acst

И фактическое ACDTотсюда время: https://www.timeanddate.com/time/zones/acdt

Обратите внимание, что замена TimeZoneInfo.ConvertTime() на TimeZoneInfo.ConvertTimeFromUtc() дает идентичные результаты.

Обратите внимание, что часовой пояс введен клиентом, и это вся информация, которую я имеюимеется в наличии.Они не записывают город.

Результат от TimeZoneInfo.ConvertTime(), по-видимому, дает время ACDT, хотя я указал ACST.

Возможно, проблема в том, что TimeZoneInfo.ConvertTime() применяет дневной светэкономия на ACST, когда не должно быть?Если так, как я могу предотвратить это?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Часовые пояса в Австралии сложны, так как они во многих частях мира. Страница Википедии на эту тему - хороший обзор.

Как вы можете видеть, есть две основные области, которые используют Центральное стандартное время Австралии.Один использует DST, другой нет.

Для .NET в Windows с классом TimeZoneInfo:

  • Используйте "Cen. Australia Standard Time" для идентификатора южного центральногоАвстралийский часовой пояс, который использует летнее время.Местоположения включают Аделаиду ​​и др.

  • Используйте "AUS Central Standard Time" для идентификатора северной центральной части австралийского часового пояса, в котором не используется летнее время.Местоположения включают Дарвина и др.

Класс TimeZoneInfo делает правильные вещи, основываясь на часовом поясе, который ему дан.

Что касается выборадля правильной зоны используйте TimeZoneInfo.GetSystemTimeZones(), чтобы вернуть все доступные часовые пояса, используйте свойства Id и DisplayName, чтобы создать раскрывающийся список.Пользователь должен только выбрать из отображаемых имен, и вам нужно только использовать идентификатор в вашем коде.

0 голосов
/ 25 октября 2018

Вам нужно позвонить TimeZoneInfo.ConvertTimeFromUtc(datetime, timezoneInfo).Проверьте это

 string timeZone = "Cen. Australia Standard Time";
            TimeZoneInfo zoneID = TimeZoneInfo.FindSystemTimeZoneById(timeZone);            
            DateTime nowAtTimeZone = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, zoneID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...