我将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)在它生成并发送到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.这是我们使用的配置.