Ruby on rails 将activerecord默认时区设置为特定时区
我使用Rails应用程序从遗留应用程序访问数据库。此应用程序使用欧洲/马德里时区存储所有datetime字段 我试图在我的应用程序中设置此选项。rb: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小时的差异
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应用程序是不可能的,但至少我知道日期总是在马德里时区。