当前位置:  开发笔记 > 后端 > 正文

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

如何解决《RubyonRails:为什么当我给DB写一个时间时,我会得到时区,然后再读回来?》经验,为你挑选了1个好方法。

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

有什么想法导致这个?



1> Laurent Farc..:

我们在日期,时区和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.这是我们使用的配置.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有