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

rc_plan · 发布于 2018年01月11日 · 最后由 rc_plan 回复于 2018年01月11日 · 227 次阅读
96

大家好,先谢谢大家,关于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"

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

共收到 4 条回复
A908ae

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

23873

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

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

15473

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

96

@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

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

32 rc_plan 关闭了讨论 01月11日 16:08
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册