【问题标题】:Convert TimeZone Identifiers In Rails在 Rails 中转换时区标识符
【发布时间】:2022-11-04 22:31:52
【问题描述】:

我需要将时区标识符转换为 Rails ActiveSupport 兼容的时区。我试图断言时间在给定区域内。 Ruby Time 类将区域指定为Time.now.zone => 'PDT'DateTime.now.zone => '+09:00',但是当我尝试将此标识符与TZInfo 或ActiveSupport 一起使用时,会出现Invalid Identifier: PDT 错误。

ActiveSupport::TimeZone.find_tzinfo(Time.now.zone) => Invalid Identifier: PDT
TZInfo::Timezone.get('PDT') => Invalid Identifier: PDT

Ruby Time 和 DateTime 区域标识符在它们自己和 Rails 助手之间不容易转换似乎很奇怪。我可以使用 utc_offset 方法,但这有点问题,因为我没有这种方式到命名区域的映射。

【问题讨论】:

  • 请注意,PDT(太平洋夏令时间)的 UTC 偏移量为 -07:00,而不是 +09:00。

标签: ruby-on-rails ruby timezone


【解决方案1】:

Ruby Time 和 DateTime 区域标识符在它们自己和 Rails 助手之间不容易转换似乎很奇怪

不奇怪,有点意思预期的(并不是特定于 Ruby,考虑到 time[zones] 主题的复杂程度)。

Rails 是一个非常固执己见的框架,关于时区它的方式完全不同:而 Ruby 的时区实现 follows RFC2822TZInfo 是基于 tz database,这是完全不同的野兽服务于不同的目的。

一般来说,时区缩写有很多问题(比如 PDT 之一)——它们是模棱两可的,充其量代表一个偏移量,而不是一个时区本身(这些问题还有更多的问题——看看this detailed explanation) .

所以,我想说的经验法则是,要么使用 Ruby 的简约内置时区支持,要么使用 Rails 的扩展支持(TZInfo 附带),但不能同时使用两者。

WRT 你的特定任务(我不完全理解,老实说) - 有单独的宝石(如TimezoneParser,但也许有一些“更有活力”的东西)可能会帮助你完成这个映射。

【讨论】:

    猜你喜欢
    • 2012-12-22
    • 2014-07-02
    • 1970-01-01
    • 2021-05-06
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多