Rails Rails console 时间不正确

johnlu · 2013年07月26日 · 最后由 JohnLu 回复于 2013年07月27日 · 3644 次阅读

在控制台上创建表记录时,时间显示不正确

2.0.0p247 :022 > user.updated_at
 => Fri, 26 Jul 2013 14:17:27 UTC +00:00

然而我系统的时间是正确的

$ date
Fri Jul 26 22:18:54 CST 2013

一个是 UTC,一个是 CST

user.updated_at.localtime

在 config/application.rb 里增加以下配置就可以了 config.time_zone = 'Beijing' 另外,rake time:zones:all 可以查看所有的时区

#2 楼 @ashchan 返回时是正确的时间

user.updated_at.localtime
 => 2013-07-26 22:17:27 +0800

但是不能保存不了

2.0.0p247 :027 > user.save
   (0.0ms)  SAVEPOINT active_record_1
   (0.3ms)  RELEASE SAVEPOINT active_record_1
 => true 
2.0.0p247 :028 > user.updated_at
 => Fri, 26 Jul 2013 14:17:27 UTC +00:00

#3 楼 @kamiiyu 为啥会这样子呢,http://railstutorial-china.org/chapter6.html 里也没说到要设置的

#3 楼 @kamiiyu 还是不行的

2.0.0p247 :012 > User.all
  User Load (0.0ms)  SELECT "users".* FROM "users"
 => #<ActiveRecord::Relation [#<User id: 1, name: "Michael Hartl", email: "[email protected]", created_at: "2013-07-26 14:53:20", updated_at: "2013-07-26 14:53:20">, #<User id: 2, name: "A Nother", email: "[email protected]", created_at: "2013-07-26 14:54:13", updated_at: "2013-07-26 14:54:13">]>

#6 楼 @JohnLu 那是因为登陆进去的就是 UTC 时间,User.last.updated_at出来的就是 CST 时间了。

#7 楼 @kamiiyu 那怎么办?时间不统一是不行的

#8 楼 @JohnLu 你是想登陆到数据库的也是 local 时间?那么在 config/application.rb config.active_record.default_timezone = :local 就可以了。

rails 的设计是保存 UTC 时间 然后根据你的 local 显示不同的 local 时间 为了做倒 i18n 如果你强烈要求保存的时间就是你的 local 时间 那么请偷偷的在 application.rb 里面加上如下秘籍

config.time_zone = 'Beijing' # or other
config.active_record.default_timezone = :local
config.active_record.time_zone_aware_attributes = false

best practice 是在数据库中保存 utc 时间,然后根据需要,读取出来后再变时区

明白了,谢谢楼上各位!

rc_plan 关于 Rails 的时区问题 提及了此话题。 01月11日 14:36
需要 登录 后方可回复, 如果你还没有账号请 注册新账号