Ruby on rails Rails Time.zone解析不';I don’我没有按预期工作

Ruby on rails Rails Time.zone解析不';I don’我没有按预期工作,ruby-on-rails,ruby,timezone,activesupport,Ruby On Rails,Ruby,Timezone,Activesupport,我在测试部署到不同时区(PDT和CDT)的两个不同暂存服务器上的rails应用程序时遇到了这个问题。两台服务器都有使用默认UTC config.time_区域的rails。除了时区配置不同之外,两台服务器的时钟都设置正确 下面是我在rails控制台中看到的内容: 在系统时区为CDT的服务器上 Time.zone.parse("Mon May 28 2012 00:00:00 GMT-0700 (PDT)") => Mon, 28 May 2012 05:00:00 UTC +00:00

我在测试部署到不同时区(PDT和CDT)的两个不同暂存服务器上的rails应用程序时遇到了这个问题。两台服务器都有使用默认UTC config.time_区域的rails。除了时区配置不同之外,两台服务器的时钟都设置正确

下面是我在rails控制台中看到的内容:

在系统时区为CDT的服务器上

Time.zone.parse("Mon May 28 2012 00:00:00 GMT-0700 (PDT)")
 => Mon, 28 May 2012 05:00:00 UTC +00:00 
在系统时区为PDT的服务器上

Time.zone.parse("Mon May 28 2012 00:00:00 GMT-0700 (PDT)")
 => Mon, 28 May 2012 07:00:00 UTC +00:00
字符串
Mon May 28 2012 00:00:00 GMT-0700(PDT)
是客户端发送的任意日期时间值。当使用通过rails params集合传入的javascript日期对象时,这是一种常见的场景

为什么这两个结果
Time.zone.parse(相同的日期时间字符串)
不同?

如果在两个系统上运行以下操作,则结果显示正确:

"Mon May 28 2012 00:00:00 GMT-0700 (PDT)".to_time
 => 2012-05-28 07:00:00 UTC

我正在ubuntu上运行带有ruby 1.9.3-p125的rails 3.2.3。

ActiveSupportTimeZone.parse
不会试图从给定字符串中提取时区信息。它只提取日期和时间,并将其转换为具有给定(本地)时区的TimeWithZone

str.to_time
将注意到“GMT-0700”行,但将生成一个没有时区的时间

您可以通过提取“GMT…”部分并将其转换为UTC偏移量(接近但不完全是时区)来伪造它。

以下是我的操作方法

> Time.zone = "Hawaii"
=> "Hawaii"
> Time.zone.parse("Tue Mar 13 2012 13:00:00 GMT+1300 (NZDT)".sub("GMT",""))
=> Mon, 12 Mar 2012 14:00:00 HST -10:00
> Time.zone = "UTC"
=> "UTC"
> Time.zone.parse("Tue Mar 13 2012 13:00:00 GMT+1300 (NZDT)".sub("GMT",""))
=> Tue, 13 Mar 2012 00:00:00 UTC 00:00

嗨,Michael,我添加了更多关于在字符串上使用“to_time”方法时如何正确解析同一日期时间字符串的详细信息。这是一个始终如一、准确无误的问题。rails设法修补ActiveSupport::TimeZone以处理此处格式的日期字符串。您可以在注释中找到补丁。最初的问题现在在rails中得到修复,通过这次提交,问题现在在rails中得到修复。见@ShyamHabarakada谢谢你的提示。很高兴他们终于解决了这个问题