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

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

从Rails ActiveSupport :: TimeZone文档 :

与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属性。

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

::的ActiveSupport TimeZone.zones_map

你可以这样做:

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