新手问题 关于 Rails 的时区问题

rc_plan · January 11, 2018 · Last by rc_plan replied at January 11, 2018 · 1580 hits

大家好,先谢谢大家,关于 rails 的时区有个问题请大家解答一下……

项目 application.rb 中的关于时区设置是这样的

config.time_zone = 'Beijing'
config.active_record.default_timezone = :local

然后解析时间字符串是这样的

Time.parse('2018-1-1 12:00:00')
=> 2018-01-01 12:00:00 +0800

Time.zone.parse('2018-1-1 12:00:00')
=> Mon, 01 Jan 2018 12:00:00 CST +08:00

所以……问题是这样的

irb(main):003:0> Page.create(title:'xxx', content:'xxx', push_time: '2018-1-11 12:00:00')
   (0.0ms)  BEGIN
  SQL (0.5ms)  INSERT INTO `pages` (`title`, `content`, `push_time`, `created_at`, `updated_at`) VALUES ('xxx', 'xxx', '2018-01-11 12:00:00', '2018-01-11 12:54:53', '2018-01-11 12:54:53')
   (10.2ms)  COMMIT
=> #<Page id: 4, title: "xxx", content: "xxx", push_time: "2018-01-11 04:00:00", created_at: "2018-01-11 04:54:53", updated_at: "2018-01-11 04:54:53">

就是我传入时间字符串是'2018-1-11 12:00:00' ,但是数据库存储的时候变成了 "2018-01-11 04:00:00"

求教啊,为什么会出现这样的问题,怎么解决这种问题啊?

你打一下 date 命令看看自己系统的时区,估计不是 CST。如果你存的时候系统时区和你 config.time_zone 的时区不一致,就会自动帮你转一下存到数据库。你再拿的时候同样会重新帮你转,看一下 Page.last.push_time 你会发现时间是正常的。

数据库里存的是 GMT,你 Page.last.created_at 读出来会发现它又加上 8 小时变成 12 点了

你可以看看你的数据库设置的时区是哪个,可以试试看把时区改成东八区之后存进去的 SQL 会变成怎样

config.active_record.default_timezone 这个可以设置下

@coderliu @liuminhan Thank u guys~~ 已经解决了

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

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

还是论坛靠谱,百度了半天没找到答案,忘了来论坛搜索了

rc_plan closed this topic. 11 Jan 16:08
You need to Sign in before reply, if you don't have an account, please Sign up first.