首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby: Time.parse()错误地返回阿拉斯加时区

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

Stack Overflow用户
提问于 2015-06-08 16:20:25
回答 1查看 313关注 0票数 0

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

代码语言:javascript
复制
> 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

所有这些都工作得很好,但是一旦我开始要求夏威夷或阿拉斯加时区,它就会返回一个不正确的结果:

代码语言:javascript
复制
> 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

即使这样也不起作用:

代码语言:javascript
复制
> Time.parse('12:30 pm -800').utc
=> 2015-06-08 12:30:00 UTC

有人知道为什么会这样吗?也许更重要的是,有没有人对如何解析时间-800或-900有任何建议?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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).zoneTime.local(year, 7, 1).zone如果提取的时区缩写与它们中的任何一个不匹配,则忽略它,并将给定的时间视为本地时间。

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

代码语言:javascript
复制
 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类。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30714328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档