Ruby on Rails:为什么当我给DB写一个时间时,我会得到时区,然后再读回来?

时间:2008-11-26 01:45:11

标签: ruby-on-rails activerecord time timezone

我将environment.rb中的config.time_zone设置为“UTC”,当我发出“select now();”时,我的mySQL服务器返回当地时区的当前时间。当我要求“select utc_timestamp;”

时,在utc中

我正在运行rails 2.1.2,mysql gem 2.7.3,activerecord gem 2.1.2和mysql --version返回“Ver 14.12 Distrib 5.0.27 for Win32(ia32)”。

编辑:我的environment.rb设置为UTC,自从我启动项目以来。服务器重启不会发生任何变化。

record = Record.find(:first)
puts Time.now
# Tue Nov 25 17:40:48 -0800 2008
record.time_column = Time.now
record.save

mysql> select * from records;
---------------------
 2008-11-26 01:40:48

#note that this is the same time, in UTC.

record = Record.find(:first)
puts record.time_column
Wed Nov 26 01:40:48 -0800 2008

#NOTE that this is eight hours in advance!  
#All I've done is store a date in the database and retrieve it again!

任何想法是什么导致了这个?

3 个答案:

答案 0 :(得分:5)

我们在日期,时区和MySQL方面遇到了同样的问题。后者假定您在其配置的时区中提供日期/时间值。

但是,由于您将Rails配置为处理UTC时间,因此ActiveRecord会转换UTC中的任何日期/时间值(因此,2008年11月25日17:40:48 - 0800 2008年11月26日星期三01:40:48 0000 2008)使用它生成并发送到MySQL的SQL更新/创建查询中的值。

在伪代码中

("time = %t", Tue Nov 25 17:40:48 -0800 2008) => "time = '2008-11-26 01:40:48'

被MySQL视为2008-11-26 01:40:48 -0800

查看调试日志文件,您将看到我的意思。它可以正常工作的唯一方式(意思是没有意外的惊喜)是在Rails和MySQL中设置相同的时区,这个时区是UTC。这是我们使用的配置。

答案 1 :(得分:1)

不是你可能想要的答案,但我发现获得一致时间的关键是在Rails中处理所有基于时区的逻辑并保持数据库愚蠢。

这回到了rails 2.0,其中timezones / utc的实现非常错误/破坏,所以现在可能会更好。

答案 2 :(得分:0)

编辑environment.rb文件后,在为数据库创建新记录之前是否重新启动了服务器?