Как отобразить правильное название часового пояса для страны в C #? - PullRequest
2 голосов
/ 04 ноября 2019

Я пытаюсь получить текущий часовой пояс для страны в C # с помощью класса Timezone. Я использовал Timezone.CurrentTimeZone.StandardName, однако это возвращает неправильное имя часового пояса.

Это то, что я пробовал до сих пор:

TimeZoneInfo.ClearCachedData();
Console.WriteLine("Local machine's time zone is: " + TimeZone.CurrentTimeZone.StandardName + " " + TimeZoneInfo.Local.StandardName + Environment.NewLine);

Когда я изменяю настройки в Windows (в настоящее время я используюWindows 10) для моего часового пояса в "Амстердам, Берлин, Берн, Рим, Стокгольм, Вена" стандартное название часового пояса должно возвращать "Стандартное время Центральной Европы" (или CET для краткости),Часовой пояс: «Стандартное время Западной Европы» (или WET для краткости).

Я что-то не так делаю или это какая-то ошибка?

У меня есть read что-то о необходимости использовать что-то под названием " Unicode Common Locale Data Repository " - или "CLDR" для краткости. Требуется ли установить пакет в любое время, когда я хотел бы использовать код, связанный с часовым поясом в эти дни?

1 Ответ

2 голосов
/ 04 ноября 2019

Нет ничего плохого в вашем кеше. Это просто природа данных.

Для часового пояса, который вы описали, данные в Windows (для английского языка):

Id           = "W. Europe Standard Time"
DisplayName  = "Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna"
StandardName = "W. Europe Standard Time"
DaylightName = "W. Europe Daylight Time"

Вы можете использовать метод IsDaylightSavingTimeTimeZoneInfo экземпляр, чтобы решить, какой из них выбрать.

Вам больше не следует использовать класс TimeZone - он устарел. Используйте TimeZoneInfo.Local вместо TimeZone.CurrentTimeZone.

Действительно, имена, данные Windows в полях StandardName и DisplayName, не идеальны. Они часто не соответствуют ожиданиям. Вот почему я написал пакет TimeZoneNames . Я также подробно писал в блоге об этой проблеме .

С TimeZoneNames вы можете получить лучшие имена для текущего часового пояса, например:

var names = TZNames.GetNamesForTimeZone(TimeZoneInfo.Local.Id, "en-US");

В то же времяЗона, как и раньше, теперь вы получите имена CLDR:

 names.Generic  = "Central European Time"
 names.Standard = "Central European Standard Time"
 names.Daylight = "Central European Summer Time"

Опять же, вы можете использовать TimeZoneInfo.Local.IsDaylightSavingTime, чтобы решить, показывать ли стандартное или дневное имя.

Если вы нене хотите жестко кодировать язык, используйте CultureInfo.CurrentCulture.IetfLanguageTag.

...