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

use*_*563 5 ruby timezone ruby-on-rails activesupport tzinfo

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

Mat*_*int 7

从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)
Run Code Online (Sandbox Code Playgroud)

我相信当您通过TZInfo加载"US/Pacific"时,它将被子类化为LinkedTimezoneInfo对象,因此您可以使用该link_to_identifier属性.

  • 请注意,[rails 5.0.1 附带 tzinfo 和 tzinfo-data](https://github.com/rails/rails/commit/9d664b18df7a81b75e45bb99858f920de040e9fb)。 (2认同)