【问题标题】:Rails Time.zone parsing doesn't work as expectedRails Time.zone 解析无法按预期工作
【发布时间】:2012-04-20 19:28:55
【问题描述】:

我在测试部署到不同时区(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。

【问题讨论】:

标签: ruby-on-rails ruby timezone activesupport


【解决方案1】:

这是我的做法

> 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

【讨论】:

  • Joseph,这个问题现在已经在 Rails 中修复了。见github.com/rails/rails/commit/…
  • @ShyamHabarakada 感谢您的提示。很高兴他们终于解决了这个问题
【解决方案2】:

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

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

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

【讨论】:

  • 嗨迈克尔,我添加了更多关于在字符串上使用 ."to_time" 方法时如何正确解析相同日期时间字符串的详细信息。这样可以始终如一且准确地工作。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
相关资源
最近更新 更多