Ruby on rails 将activerecord默认时区设置为特定时区

Ruby on rails 将activerecord默认时区设置为特定时区,ruby-on-rails,ruby-on-rails-4,rails-activerecord,Ruby On Rails,Ruby On Rails 4,Rails Activerecord,我使用Rails应用程序从遗留应用程序访问数据库。此应用程序使用欧洲/马德里时区存储所有datetime字段 我试图在我的应用程序中设置此选项。rb: config.time_zone = 'Madrid' config.active_record.default_timezone = :local 不幸的是,它没有像我预期的那样起作用。看起来Rails正在使用我系统的时区(美国/圣保罗)。因此,存储为以下内容的日期: 2015-09-09 18:38:01 将在Rails中显示5小时的差异

我使用Rails应用程序从遗留应用程序访问数据库。此应用程序使用欧洲/马德里时区存储所有datetime字段

我试图在我的应用程序中设置此选项。rb:

config.time_zone = 'Madrid'
config.active_record.default_timezone = :local
不幸的是,它没有像我预期的那样起作用。看起来Rails正在使用我系统的时区(美国/圣保罗)。因此,存储为以下内容的日期:

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

我期待着“Wed,09 Sep 201518:38:01 CEST+02:00”,这是存储在马德里时区数据库中的值。

如何保存
发送日期属性


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

中配置的当前日期时间。我知道这是3年前的事了,但可能其他人也会像我一样有同样的问题

当您在配置中放入
config.active\u record.default\u timezone=:local
时,AR假设DB有本地时区,local在这里表示计算机上的时区。要改变这种行为非常困难,您必须同时对ActiveRecord和ActiveModel进行修补

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

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

ENV["TZ"] = "Madrid"
或者在正常运行服务器之前设置env变量, 不要忘记
config.active\u record.default\u timezone=:local


这样,所有读写到DB的值都将位于马德里时区

查看@NickM,我已经有了,但它不起作用。看看这个。它应该返回“Wed,09 Sep 2015 18:38:01 CEST+02:00”(存储在数据库中的值,在马德里时区),而不是“Wed,09 Sep 2015 23:38:01 CEST+02:00”,这是由遗留PHP应用程序保存的。它不是由Rails保存的。不幸的是,改变PHP应用程序是不可能的,但至少我知道日期总是在马德里时区。