ruby-on-rails - Rails 中的时区怪异

标签 ruby-on-rails timezone

这是一个非常奇怪的 Rails 问题 - 我用 google 搜索了一下这是否与已知错误有关,但没有找到任何东西 - 如果有有用的链接和解决方案,我们将不胜感激。

我可以将问题归结为:

如果我启动 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 似乎没有这个问题,所以我现在将恢复到这个问题。

最佳答案

ActiveSupport::TimeZone正在拦截 Time.zone 以便可以对其进行腌制和恢复。由于某种原因,这是延迟完成的(这就是为什么您的更改不会立即显示)。这里存在跨 session 和多线程问题,我不知道这样做的正确性。我只能说:

  • 你所看到的确实正在发生
  • 它之所以发生是因为它是这样编码的
  • 有关于修复此问题的待办事项
  • (至少对我来说)尚不清楚全局“正确”的行为应该是什么。

此类功能的基本问题是,没有明确的方法可以从 setter 内部辨别应用程序程序员的意图范围。这是站点范围的设置吗? session 范围设置?一闪而过的幻想?

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

关于ruby-on-rails - Rails 中的时区怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/722144/

相关文章:

php - PHP 使用的美国时区列表?

java - 在 Java 中使用各种日历时区(不使用 Joda Time)

datetime - NodaTime 中 System.TimeZoneInfo.IsDaylightSavingTime 的等效项是什么?

PostgreSQL:如何测试时间戳是否有时区?

ruby-on-rails - 如何使用非 rake 参数调用 rake

ruby-on-rails - 如何使用systemd管理一组resque工作人员?

ruby-on-rails - 删除关系未经过已审核 gem 的审核

php - 存储时间信息 : Timezone required?

ruby-on-rails - heroku db :push 的点击问题

ruby-on-rails - 看门人限制适用范围