Создайте список похожих на Windows имен часовых поясов в Linux .NET Core - PullRequest
0 голосов
/ 14 ноября 2018

У нас есть веб-приложение .NET 4.7 MVC 5, работающее под Windows, которое позволяет пользователям выбирать часовой пояс, используя стандартные отображаемые имена Windows, такие как (UTC+00:00) Dublin, Edinburgh, Lisbon, London:

Windows time zone display names

Мы хотели бы предоставить тот же список параметров часового пояса через новый API, созданный на основе .NET Core 2.0, который будет работать в док-контейнере Linux. Возможно ли это?

Я нашел Мэтт Джонсон превосходный TimeZoneConverter , который отлично справляется с конвертацией между GMT Standard Time в Windows и Europe/London в IANA. Однако я не могу получить отображаемое имя Windows откуда-либо.

Вот пример кода для отображения информации о часовом поясе:

var timeZoneIds = TimeZoneConverter.TZConvert.KnownWindowsTimeZoneIds.ToList();

foreach (var timeZoneId in timeZoneIds.Take(4))
{
    if (TimeZoneConverter.TZConvert.TryGetTimeZoneInfo(timeZoneId, out var timeZoneInfo))
    {
        Console.WriteLine($"Windows Id:   {timeZoneId}");
        Console.WriteLine($".NET Id:      {timeZoneInfo.Id}");
        Console.WriteLine($"Display name: {timeZoneInfo.DisplayName}");
        Console.WriteLine("----");
    }
}

При запуске на моей машине для разработки Windows выдает следующее:

Windows Id:   AUS Central Standard Time
.NET Id:      AUS Central Standard Time
Display name: (UTC+09:30) Darwin
----
Windows Id:   AUS Eastern Standard Time
.NET Id:      AUS Eastern Standard Time
Display name: (UTC+10:00) Canberra, Melbourne, Sydney
----
Windows Id:   Afghanistan Standard Time
.NET Id:      Afghanistan Standard Time
Display name: (UTC+04:30) Kabul
----
Windows Id:   Alaskan Standard Time
.NET Id:      Alaskan Standard Time
Display name: (UTC-09:00) Alaska
----

При запуске в Docker-контейнере Linux мы получаем:

Windows Id:   AUS Central Standard Time
.NET Id:      Australia/Darwin
Display name: GMT+09:30
----
Windows Id:   AUS Eastern Standard Time
.NET Id:      Australia/Sydney
Display name: GMT+10:00
----
Windows Id:   Afghanistan Standard Time
.NET Id:      Asia/Kabul
Display name: GMT+04:30
----
Windows Id:   Alaskan Standard Time
.NET Id:      America/Anchorage
Display name: GMT-09:00
----

Есть ли какой-нибудь способ получить (скажем) (UTC+10:00) Canberra, Melbourne, Sydney при работе внутри Docker-контейнера Linux?

Возможные хаки или обходные пути, о которых я думал до сих пор:

  • Жесткий код списка отображаемых имен Windows в источнике API
  • Создайте «достаточно хорошее» отображаемое имя на основе имеющейся у нас информации, например (GMT+10:00) AUS Eastern Standard Time
  • Посмотрите, может ли пакет Matt Johnson TimeZoneNames использоваться для создания дружественного списка

1 Ответ

0 голосов
/ 26 марта 2019

Теперь это возможно с TimeZoneNames версии 4.0.0.

string languageCode = CultureInfo.CurrentCulture.IetfLanguageTag; // ex: "en-US"
var displayNames = TZNames.GetDisplayNames(languageCode);

В результате получается словарь, в котором ключ - это идентификатор Windows часового пояса, а значение - локализованное отображаемое имя.

Если вы хотите вместо этого возвращать имена часовых поясов IANA в качестве ключей, тогда передайте true в качестве необязательного второго параметра:

var displayNames = TZNames.GetDisplayNames(languageCode, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...