Rails中的时区怪异

时间:2009-04-06 16:09:05

标签: ruby-on-rails timezone

这是一个非常奇怪的Rails问题 - 我已经google了一下,看看这是否与已知的bug有关,但是没有找到任何东西 - 对于有用的链接以及解决方案来说都是无用的。

我可以将问题归结为:

如果我启动我的Rails应用程序,并通过HTTP请求执行以下Rails代码。

Time.zone = 'Europe/London'
logger.info Time.zone.inspect

日志将此显示为时区

#<ActiveSupport::TimeZone:0x3d7438c @tzinfo=nil, @name="UTC", @utc_offset=0>

在下一个请求(以及大多数后续请求)中,相同代码行的日志显示此

#<ActiveSupport::TimeZone:0x46cc100 @tzinfo=#<TZInfo::DataTimezone: Europe/London>, @name="Europe/London", @utc_offset=nil>

任何人都知道到底发生了什么事?

(如果有帮助,我正在运行Rails 2.3.2)

编辑:看起来Rails 2.2.2没有这个问题,所以我现在将恢复原状。

1 个答案:

答案 0 :(得分:4)

ActiveSupport::TimeZone正在拦截Time.zone,以便可以对其进行腌制和恢复。由于某种原因,这是懒惰的(这就是为什么你的更改不会立即显示)。这里有交叉会话和多线程问题,我不知道它的权利。我只能说:

  • 你看到的确发生了什么
  • 它正在发生,因为它的编码方式
  • 有关于修复本
  • 的公开TODO项目
  • 至少(对我来说)不清楚全球“正确”行为应该是什么。

这种功能的基本问题是没有明确的方法可以从setter中识别应用程序员的意图范围。这是一个网站范围的设置吗?会话范围设置?过时的幻想?

在约定优于配置范例中,这样的事情需要一个约定来解决它们,而这个领域还没有得到它。