Ruby: Time.parse()错误地返回阿拉斯加时区



在我的应用程序中,我使用

> 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).zoneTime.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

最新更新