我在测试部署到两个不同时间段(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。
答案 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