Rails Time.zone解析不能按预期工作

时间:2012-04-07 16:08:51

标签: ruby-on-rails ruby timezone activesupport

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

以下是我在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 Date对象时,这是一种常见的情况。

为什么两个结果Time.zone.parse(identical_date_time_string)不同?

如果我在两个系统上运行以下命令,结果显示正确:

"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。

2 个答案:

答案 0 :(得分:0)

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

str.to_time会注意到“GMT-0700”系列,但会产生没有时区的时间。

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

答案 1 :(得分:0)

我是这样做的

> 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