01 авг. 2014 г., 19:55 от govin

Полное название часового пояса в NodaTime

В NodaTime, как найти полное имя часового пояса с указанным идентификатором часового пояса tz?

Например, если я поставлю «America / Los_Angeles», мне нужно вернуть «Pacific Standard Time».

Ответы на вопрос (0)

02 авг. 2014 г., 07:47 от Malcolm Rowe

Сам TZDB не содержит описания часовых поясов: часовой пояс с идентификаторомAmerica/Los_Angeles просто содержит переходы с такими именами, как «PDT» и «PST». Таким образом, с этой точки зрения, данных просто нет.

Тем не менее, выМожно получить идентификаторы часовых поясов Windows, которые сопоставляются с данной зоной TZDB (первоначально изCLDRwindowsZones.xml данные), и Windows обычно использует такие имена, как «Тихоокеанское стандартное время» для своих идентификаторов зон.

например

var source = TzdbDateTimeZoneSource.Default;
var windowsIds = (from item in source.WindowsMapping.PrimaryMapping
    where item.Value == "America/Los_Angeles"
    select item.Key).ToList();

Тем не менее, есть некоторые оговорки с этим подходом:

Как показано выше, может быть любое количество идентификаторов зон Windows, которые сопоставляются с данной зоной TZDB. В текущих данных это всегда ноль или единица (Europe/Vienna являясь примером зоны TZDB, которую не использует идентификатор зоны Windows), но в теории нет причин, по которым вы не можете найти два или более идентификаторов зоны Windows, сопоставляемых с одной и той же зоной TZDB.Некоторые идентификаторы зоны Windows не особенно хороши: например,Europe/London сопоставляется с зоной Windows под названием «Стандартное время по Гринвичу», которая не является хорошей строкой для показа пользователю.

Однако для того, что вы делаете, это может быть приемлемым.

03 авг. 2014 г., 06:23 от 141k

Информация, необходимая для создания «полной формы» имени часового пояса, не указана во времени Noda, но онаМожно быть найденным вCLDR.

Недавно я собрал библиотеку, называемую просто «Имена часовых поясов», которая встраивает имена часовых поясов CLDR. Вы можете использовать их с идентификаторами IANA (TZDB), которые используются часовыми поясами Noda.

Установить из NuGetИсточник на GitHubУвидетьмодульные тесты например использование и вывод.

Просто передайте часовой пояс и язык, и он предоставит подходящее общее имя, стандартное имя и название дневного света. Вы можете использовать Noda Time, чтобы решить, какая форма подходит для отображения.

var names = TimeZoneNames.GetNamesForTimeZone("America/Los_Angeles", "en-US");

Assert.Equal("Pacific Time", names.Generic);
Assert.Equal("Pacific Standard Time", names.Standard);
Assert.Equal("Pacific Daylight Time", names.Daylight);

Для языка вы можете передать либо двузначный код, например"en"или вы можете передать полностью локализованную версию, такую ​​как"en-US", Это соответствуетCultureInfo имена, чтобы вы могли передатьCultureInfo.CurrentUICulture.Name если хочешь.

03 нояб. 2015 г., 16:47 от barrycarter

Короткий ответ:https://github.com/barrycarter/bcapps/blob/master/ASTRO/tz2name.txt

Длинный ответ: как уже отмечали другие, вы можете использовать CLDRcommon/supplemental/metaZones.xml файл для сопоставления часовых поясов с регионами. Например:

                    <timezone type="America/Barbados">
                            <usesMetazone mzone="Atlantic"/>
                    </timezone>

сопоставляет часовой пояс "Америка / Барбадос" с регионом "Атлантика".

Вы можете использоватьcommon/main/en.xml преобразовать регион в название часового пояса. Например:

                    <metazone type="Atlantic">
                            <long>
                                    <generic>Atlantic Time</generic>
                                    <standard>Atlantic Standard Time</standard>
                                    <daylight>Atlantic Daylight Time</daylight>
                            </long>
                            <short>
                                    <generic>AT</generic>
                                    <standard>AST</standard>
                                    <daylight>ADT</daylight>
                            </short>
                    </metazone>

сообщает нам названия часовых поясов (длинные и короткие формы), используемых в «атлантическом» регионе.

Это в значительной степени повторение других ответов, но с прямыми ссылками на рассматриваемые файлы.

ВАШ ОТВЕТ НА ВОПРОС