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