Rails 3.2 + Ruby 1.9.3,created_at以错误的时区返回

时间:2013-03-24 00:40:43

标签: ruby-on-rails ruby activerecord timezone

我升级到Rails 3.2和Ruby 1.9.3,我得到了一个非常奇怪的行为

我有一个名为Entry的模型。创建新条目时,它会以当前日期和时间插入到数据库中。

但是当我运行Entry.find_by_id(THE_ENTRY_ID).created_at时,我得到了在datetime创建的“正确”,但在另一个TimeZone中,例如: 在db:

  

2013-03-24 00:05:29

在Rails控制台和应用程序中:

  

星期六,2013年3月23日20:05:29 EDT -04:00

为什么突然返回错误的时区?

2 个答案:

答案 0 :(得分:3)

在阅读DOCS并看到此导演后,确定: http://railscasts.com/episodes/106-time-zones-revised

现在一切都很清楚了。

config.time_zone = 'Eastern Time (US & Canada)'

此设置是将所有时间对象转换为当前时区的实际设置。这就是我把它看成-4

的方式

此设置:

config.active_record.default_timezone

是决定如何在DB中保存时间的那个,但是...它只获得2个可能的值:: local和:UTC,默认为:UTC

当我使用rails控制台查看我的条目时,显示的时间是在转换为“东部时间”之后,以便查看存储在数据库中的实际日期:

created_at_before_type_cast

返回UTC时间,因为它是默认值

之所以我认为在DB中它存储在我的时区+2 是因为我使用了MySQL Workbench,它的GUI只显示了我当地机器时间的日期时间值。

摘要:

实际重要的设置:

config.time_zone

它运作得很好。 通过DOCS非常重要

答案 1 :(得分:1)

检查application.rb中的配置。如果未设置时区,则rails将采用操作系统的默认时区。要解决此问题,请将UTC设置为时区。