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

时间:2015-06-08 16:20:26

标签: ruby datetime timezone

在我的应用中,我正在使用

> 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的时间有任何建议?

1 个答案:

答案 0 :(得分:2)

-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. 的{​​p> The documentation包含(强调我的):

  

由于本地定义的时区之间存在大量冲突   世界各地的缩写,这种方法并非意图   了解所有这些。例如,使用缩写“CST”   各种各样:

Time.local(year,
  1, 1).zone
     

基于这个事实,此方法只能理解时区   RFC 822中描述的缩写和系统时区,在   命令命名。 (即RFC 822中的定义会覆盖系统时间   区域定义。)系统时区取自Time.local(year, 7, 1).zone 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) 如果提取的时间   区域缩写与它们中的任何一个都不匹配,它被忽略了   给定时间被视为当地时间。

以下内容来自RFC 822(5.1)中的语法说明:

-0800

如您所见,未提及您的时区名称。您必须编写-09004DIGIT,因为需要前导零(以匹配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 部分)。如果您想要或必须保留名称,可以使用更复杂的DateTime类。

{{1}}