Как я могу получить имена Rails TimeZone из устаревших идентификаторов TZInfo?
Уже есть вопрос, который отвечает на вопрос, как преобразовать "America/Los_Angeles" в "Pacific Time (США и Канада)". Однако я хочу конвертировать "США / Тихий океан" и другие устаревшие часовые пояса в Rails TimeZone. Я не могу найти в библиотеке ничего, что могло бы помочь мне в этом.
3 ответа
Из документации Rails ActiveSupport:: TimeZone:
Версия TZInfo в комплекте с Active Support включает только определения, необходимые для поддержки зон, определенных классом TimeZone. Если вам нужно использовать зоны, которые не определены TimeZone, вам нужно установить гем TZInfo (если локальная версия самоцвета установлена локально, она будет использоваться вместо связанной версии).
Лично я считаю, что часовые пояса в Rails глупы. Они произвольно ограничены тем, что Rails описывает как "значимое подмножество 146 зон". Но они ничего не делают, чтобы объяснить, как они определяют, какие зоны являются "значимыми", а какие отбрасываются.
Такие идентификаторы, как "США / Тихий океан", известны как "ссылки" или "псевдонимы" в данных TZDB. Я мог видеть, что, возможно, они могут быть опущены в Rails, но есть много других часовых поясов реального мира, которые полностью отсутствуют.
Единственное место, где я когда-либо видел идентификаторы часовых поясов Rails в реальном мире, - это API Twitter. С другой стороны, идентификаторы IANA/TZDB повсеместны.
Лучший совет, который я могу предложить, - забыть о часовых поясах Rails и просто использовать Ruby TZInfo Gem напрямую. Он имеет полную реализацию TZDB со всеми зонами, включая псевдонимы.
Если вам действительно нужно продолжать использовать зоны Rails, вы можете сначала использовать TZInfo для разрешения псевдонима к реальной зоне, а затем посмотреть, находится ли эта зона в Rails. MAPPING
толковый словарь. Например:
"US/Pacific" => "America/Los_Angeles" (via TZInfo)
"America/Los_Angeles" => "Pacific Time (US & Canada)" (via Rails MAPPING)
Я полагаю, что когда вы загружаете "США / Тихий океан" через TZInfo, он будет разделен на LinkedTimezoneInfo
объект, чтобы вы могли использовать link_to_identifier
атрибут оттуда.
Вы можете сделать это следующим образом:
arr = TZInfo::Timezone.all_country_zone_identifiers.collect { |x| x + " " + ActiveSupport::TimeZone[x].formatted_offset }
arr.sort
В этой команде будут отображаться 144 названия часовых поясов.
ActiveSupport:: TimeZone.zones_map