在我的应用程序中,我正在使用
> 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有任何建议?
发布于 2015-06-08 17:49:05
文献资料 of Time.parse包含(重点是地雷):
由于在世界各地本地定义的时区缩略语之间存在许多冲突,此方法并不是要理解所有这些缩写。例如,缩写“CST”的不同用法如下: -美国/芝加哥06:00,美国/哈瓦那-05:00,亚洲/哈尔滨+08:00,澳大利亚/达尔文+09:30,澳大利亚/阿德莱德+10:30,等等 基于这一事实,这种方法只理解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 UTChttps://stackoverflow.com/questions/30714328
复制相似问题