已经有一个问题回答了如何将“America/Los_Angeles”转换为“太平洋时间(美国和加拿大)”。但是我想将“美国/太平洋”和其他过时的时区转换为 Rails 时区。我无法在图书馆中找到任何可以帮助我完成此任务的东西。
3 回答
来自 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 将别名解析为实际区域,然后查看该区域是否在 RailsMAPPING
字典中。例如:
"US/Pacific" => "America/Los_Angeles" (via TZInfo)
"America/Los_Angeles" => "Pacific Time (US & Canada)" (via Rails MAPPING)
我相信当您通过 TZInfo 加载“US/Pacific”时,它将被子类化为一个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