在我的应用中,我正在使用
> 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的时间有任何建议?
答案 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
如您所见,未提及您的时区名称。您必须编写-0900
和4DIGIT
,因为需要前导零(以匹配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}}