我正在使用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”这是存储在马德里时区数据库中的值。
答案 0 :(得分:0)
如何保存sent_date
属性?
请记住,如果您使用DateTime.now
,它将检索您系统的当前日期时间(圣保罗时间)。相反,您应该使用Time.zone.now
,它将检索application.rb
答案 1 :(得分:0)
我知道这是3年前,但也许其他人会像我一样有同样的问题。
当您在配置中放置config.active_record.default_timezone = :local
时,AR会假定数据库具有本地时区,本地时区是您计算机上的本地时区。改变这种行为非常困难,你必须对ActiveRecord和ActiveModel进行修补。
TZ
环境变量设置为Madrid
。
您可以输入config/initializers/timezone.rb
以下
ENV["TZ"] = "Madrid"
或者只是在正常运行服务器之前设置env变量,
并且不要忘记config.active_record.default_timezone = :local
。
这样,读取和写入DB的所有值都将在马德里时区
中