在我的应用程序中,我使用
> Time.parse('12:30 pm MDT').utc
=> 2015-06-08 18:30:00 UTC
> Time.parse('12:30 pm EDT').utc
=> 2015-06-08 16:30:00 UTC
> Time.parse('12:30 pm CDT').utc
=> 2015-06-08 17:30:00 UTC
> Time.parse('12:30 pm PDT').utc
=> 2015-06-08 19:30:00 UTC
> Time.parse('12:30 pm MST').utc
=> 2015-06-08 19:30:00 UTC
这些都工作得很好,但是当我开始询问夏威夷或阿拉斯加时区时,它返回一个不正确的结果:
> Time.parse('12:30 pm HST').utc
=> 2015-06-08 12:30:00 UTC
> Time.parse('12:30 pm HAST').utc
=> 2015-06-08 12:30:00 UTC
> Time.parse('12:30 pm AKDT').utc
=> 2015-06-08 12:30:00 UTC
> Time.parse('12:30 pm AKST').utc
=> 2015-06-08 12:30:00 UTC
即使这样也不行:
> Time.parse('12:30 pm -800').utc
=> 2015-06-08 12:30:00 UTC
有人知道为什么会发生这种情况吗?也许更重要的是,有人能告诉我如何解析-800或-900的时间吗?
Time.parse
的文档包含(重点是我的):
由于本地定义的时区之间存在大量冲突世界各地都有缩略语,本方法不打算使用了解他们所有人。例如,使用缩写"CST"分别为:
-06:00 in America/Chicago, -05:00 in America/Havana, +08:00 in Asia/Harbin, +09:30 in Australia/Darwin, +10:30 in Australia/Adelaide, etc.
基于这个事实,这个方法只理解时区RFC 822中描述的缩写和系统时区,在顺序命名。(即RFC 822中的定义覆盖了系统时间区域定义。)系统时区取自
Time.local(year, 1, 1).zone
和Time.local(year, 7, 1).zone
。如果提取时间区域缩写与其中任何一个都不匹配,它将被忽略,并且
RFC 822(5.1)中的语法描述如下:
zone = "UT" / "GMT" ; Universal Time
; North American : UT
/ "EST" / "EDT" ; Eastern: - 5/ - 4
/ "CST" / "CDT" ; Central: - 6/ - 5
/ "MST" / "MDT" ; Mountain: - 7/ - 6
/ "PST" / "PDT" ; Pacific: - 8/ - 7
/ 1ALPHA ; Military: Z = UT;
; A:-1; (J not used)
; M:-12; N:+1; Y:+12
/ ( ("+" / "-") 4DIGIT ) ; Local differential
; hours+min. (HHMM)
您可以看到,没有提到您的时区名称。你必须写-0800
和-0900
作为前导零是必需的(以匹配4DIGIT
部分)。如果您想要或必须保留名称,可以使用更复杂的DateTime
类。
Time.parse('12:30 pm -0800').utc # => 2015-06-08 20:30:00 UTC
DateTime.parse('12:30 pm AKDT').to_time.utc # => 2015-06-08 20:30:00 UTC