1

我将 environment.rb 中的 config.time_zone 设置为“UTC”,当我发出“select now();”时,我的 mySQL 服务器返回本地时区的当前时间 当我要求“选择 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!

任何想法是什么原因造成的?

4

3 回答 3

5

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

但是,由于您将 Rails 配置为处理 UTC 时间,ActiveRecord 在使用该值之前会转换 UTC 中的任何日期/时间值(因此 Tue Nov 25 17:40:48 -0800 2008 变为 Wed Nov 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。这是我们使用的配置。

于 2008-11-26T10:40:04.427 回答
1

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

这要追溯到 rails 2.0,其中 timezones/utc 实现令人难以置信的错误/损坏,所以现在可能会更好。

于 2008-11-27T08:41:47.330 回答
0

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

于 2008-11-26T06:54:32.680 回答