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

我将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! 

有什么想法导致这个?

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

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

在伪代码中

 ("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。 这是我们使用的配置。

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

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

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