我在测试部署在不同时区(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日期对象时,这是一个常见的场景。为什么这两个结果不同?
如果在两个系统上都运行以下命令,则结果将正确:
"Mon May 28 2012 00:00:00 GMT-0700 (PDT)".to_time
=> 2012-05-28 07:00:00 UTC
我在ubuntu上运行rails 3.2.3和ruby 1.9.3-p125。
最佳答案
ActiveSupportTimeZone.parse
不尝试从给定字符串中提取时区信息。它只提取日期和时间,并将其转换为具有给定(本地)时区的TimeWithZone。str.to_time
会注意到“gmt-0700”行,但会产生一个没有时区的时间。
您可以通过提取“gmt…..”部分并将其转换为UTC偏移量(接近但不完全是时区)来伪造它。
关于ruby-on-rails - Rails Time.zone解析无法按预期进行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10056025/