Rails Active Record无法保存指定时区时间的问题求助
Rails 中 DateTime 时区存储与显示问题解决
首先得帮你理清 Rails 处理时区的核心逻辑——这是很多刚接触 Rails 时区配置的开发者容易踩的坑:
为什么数据库里存的是 UTC 时间?
Rails 默认的设计就是所有时间以 UTC 格式存储到数据库,而你在 application.rb 里设置的 config.time_zone = 'Taipei',作用是让 Rails 在从数据库读取时间、或者在视图/控制台中展示时间时,自动转换成台北时区(东八区)的时间。这种设计是为了避免不同时区环境下的时间混乱,是 Rails 推荐的最佳实践。
你的问题到底出在哪?
你在控制台直接查看 @match.dating_datetime 时,默认显示的是数据库里的原始 UTC 时间,但实际上这个时间对应的东八区时间就是你期望的 2018-03-24 19:06:10。你可以立刻在控制台验证一下:
@match.dating_datetime.in_time_zone('Taipei') # 执行后应该会输出类似 2018-03-24 19:06:10 +0800 的结果
让控制台默认显示东八区时间
如果你不想每次都手动调用 in_time_zone,可以在控制台里执行这行代码,之后所有时间都会默认以台北时区展示:
Time.zone = 'Taipei'
优化你的时间生成代码
你当前生成时间的写法可以更规范一点,直接用 Rails 提供的时区方法,避免手动处理时区偏移:
# 替换原来的时间生成代码 dating_datetime = Time.zone.now + rand(5.hours)
这样生成的时间本身就是台北时区的,保存到数据库时会自动转成 UTC 存储,读取时又会自动转回东八区,全程不需要手动处理时区偏移量。
最后验证正确性
你可以通过两步确认时间处理是正常的:
- 数据库里存储 UTC 时间是正常行为,不用纠结这个
- 在 Rails 代码或控制台中读取
@match.dating_datetime时,只要你正确设置了config.time_zone = 'Taipei',得到的就是东八区的时间
内容的提问来源于stack exchange,提问作者Adamlin0708
相关产品推荐
相关产品推荐

