我需要将时区标识符转换为Rails ActiveSupport兼容的时区。我试图Assert一个时间位于给定的时区中。Ruby Time类将时区指定为Time.now.zone => 'PDT'
和DateTime.now.zone => '-07: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方法,但这有点问题,因为我没有那种方式到命名区域的Map。
1条答案
按热度按时间j91ykkif1#
Ruby时间和日期时区标识符不能在它们自己和Rails助手之间轻松转换,这看起来非常奇怪
这并不奇怪,这是一种 * 预期 *(考虑到时区主题是多么的复杂,这并不是Ruby特有的)。
Rails是一个非常固执己见的框架,对于时区,它采取了完全不同的方式:虽然Ruby的时区实现遵循RFC 2822,但
TZInfo
基于tz database,tz database与用于不同目的的tz database截然不同。一般来说,时区缩写有很多问题(比如PDT一)--它们模棱两可,最多代表一个偏移,而不是时区本身(比这些缩写有更多的问题--看看this detailed explanation)。
因此,我认为经验法则是,要么使用Ruby的最小化内置时区支持,要么使用Rails的扩展时区支持(
TZInfo
附带的),但不能两者都使用。WRT您的特定任务(我不完全理解,诚实)-有单独的宝石(如
TimezoneParser
,但也许有一些“更生动”),可能会帮助您与此Map。