将activerecord默认时区设置为特定时区

时间:2015-09-25 12:24:01

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

我正在使用Rails应用程序从遗留应用程序访问数据库。此应用程序使用Europe / Madrid时区存储所有日期时间字段。

我试图在我的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”这是存储在马德里时区数据库中的值。

2 个答案:

答案 0 :(得分:0)

如何保存sent_date属性?

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

中配置的当前日期时间

答案 1 :(得分:0)

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

当您在配置中放置config.active_record.default_timezone = :local时,AR会假定数据库具有本地时区,本地时区是您计算机上的本地时区。改变这种行为非常困难,你必须对ActiveRecord和ActiveModel进行修补。

但是,Trick要说服Ruby(不是Rails)马德里是你当地的时间。您可以将TZ环境变量设置为Madrid

您可以输入config/initializers/timezone.rb以下

ENV["TZ"] = "Madrid"

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

这样,读取和写入DB的所有值都将在马德里时区