如何从过时的TZInfo标识符中获取Rails TimeZone名称?

时间:2013-10-16 07:37:08

标签: ruby-on-rails ruby timezone activesupport tzinfo

已经有一个问题可以解答如何将“America / Los_Angeles”转换为“太平洋时间(美国和加拿大)”。但是我想将“US / Pacific”和其他过时的时区转换为Rails TimeZone。我无法在图书馆找到任何可以帮助我完成此任务的内容。

3 个答案:

答案 0 :(得分:7)

来自Rails ActiveSupport::TimeZone docs

  

与Active Support捆绑在一起的TZInfo版本仅包含支持TimeZone类定义的区域所需的定义。如果您需要使用TimeZone未定义的区域,则需要安装TZInfo gem(如果本地安装了最新版本的gem,将使用此版本而不是捆绑版本。)

就个人而言,我认为Rails时区很愚蠢。它们被任意限制为Rails所描述的“146个区域的有意义的子集”。但他们没有解释他们如何确定哪些区域“有意义”哪些区域被丢弃。

诸如“US / Pacific”之类的标识符在TZDB数据中称为“链接”或“别名”。我可以看到它们可能会从Rails中省略,但还有许多其他现实世界的时区完全缺失。

我唯一在现实世界中看到Rails时区标识符的地方是Twitter API。另一方面,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加载“US / Pacific”时,它将被子类化为LinkedTimezoneInfo对象,因此您可以使用link_to_identifier属性。

答案 1 :(得分:1)

在此命令中将显示144个时区名称。

  

的ActiveSupport :: TimeZone.zones_map

答案 2 :(得分:0)

你可以这样做:

arr = TZInfo::Timezone.all_country_zone_identifiers.collect { |x| x + " " + ActiveSupport::TimeZone[x].formatted_offset }
arr.sort