【问题标题】:Set activerecord default timezone to a specific timezone将 activerecord 默认时区设置为特定时区
【发布时间】:2015-09-25 12:24:01
【问题描述】:

我正在使用 Rails 应用程序从旧应用程序访问数据库。此应用程序使用欧洲/马德里时区存储所有日期时间字段。

我试图在我的 application.rb 中设置它:

config.time_zone = 'Madrid'
config.active_record.default_timezone = :local

不幸的是,它没有按我的预期工作。看起来 Rails 正在使用我系统的时区( America/Sao_Paulo )。所以一个日期存储为:

2015-09-09 18:38:01

在 Rails 中会显示 5 小时的差异:

2015-09-09 23:38:01

这是圣保罗和马德里的区别。它也应该在 Rails 中显示 18:38:01,因为我的应用的默认时区是马德里。

有没有办法在不更改我的操作系统时区的情况下强制使用 ActiveRecord 时区?

--- 编辑---

这是我得到的输出:

2.1.3 :004 > Time.zone.name
 => "Madrid"
2.1.3 :005 > LogSent.last.sent_date
  LogSent Load (0.4ms)  SELECT  `log_sent`.* FROM `log_sent`  ORDER BY `log_sent`.`id` DESC LIMIT 1
 => Wed, 09 Sep 2015 23:38:01 CEST +02:00

我期待“2015 年 9 月 9 日星期三 18:38:01 CEST +02:00”,这是存储在马德里时区数据库中的值。

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord


【解决方案1】:

我知道这是 3 年前的事了,但也许其他人会像我一样有同样的问题。

当您将config.active_record.default_timezone = :local 放入您的配置时,AR 假定 DB 具有本地时区,此处本地表示您计算机上的时区。改变这种行为非常困难,您必须同时对 ActiveRecord 和 ActiveModel 进行猴子补丁。

不过,诀窍是让 Ruby(而不是 Rails)相信马德里是您的当地时间。您可以通过将TZ 环境变量设置为Madrid 来做到这一点。

您可以在您的config/initializers/timezone.rb 中输入以下内容

ENV["TZ"] = "Madrid"

或者只是在正常运行服务器之前设置环境变量, 不要忘记config.active_record.default_timezone = :local

这样所有读取和写入数据库的值都将在马德里时区

【讨论】:

  • 当您在 MySQL 中使用特定时区的 datetime 字段,在设置为 UTC 的服务器中运行时,这是正确的答案,如果没有旧版应用程序中的重大重构。
【解决方案2】:

如何保存sent_date 属性?

请记住,如果您使用DateTime.now,它将检索您系统的当前日期时间(圣保罗时间)。相反,您应该使用Time.zone.now,它将检索在application.rb 中配置的当前日期时间

【讨论】:

  • 它由旧的 PHP 应用程序保存。 Rails 没有保存它。不幸的是,更改 PHP 应用程序是不可能的,但至少我知道日期总是在马德里时区。
猜你喜欢
  • 2015-07-01
  • 2011-11-21
  • 2011-07-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2012-12-21
  • 2022-01-24
相关资源
最近更新 更多