Rails时区问题

一个Rails应用有三个时间:

  • 服务器系统的时间
  • Rails应用的时间
  • 存入数据库的时间

如果你想存入本地时间到数据库中。

首先,你要先确保系统时间是正确的。
其次,你要把应用的时区设置为本地时区
最后,ActiveRecord的时区也设置为本地时区

按照上述可以写出下面的代码

config.time_zone = "beijing" # 从ActiveRecord中取的时候是本地时间
config.active_record.default_timezone = :local # 存入数据库的时间也是本地时区的时间
config.active_record.time_zone_aware_attributes = false # 关闭以UTC格式存入数据库并读取以本地时区格式读取的功能

这样就可以以本地时区时间存入数据库。

如果你的应用是面对全球用户。

建议以utc的时区存到数据库,每次查询的时候,转换成本地时区就可以。那么,Rails是默认时区utc,所以就不用配置application.rb

去掉

config.time_zone = "beijing" # 从ActiveRecord中取的时候是本地时间
config.active_record.default_timezone = :local # 存入数据库的时间也是本地时区的时间
config.active_record.time_zone_aware_attributes = false # 关闭以UTC格式存入数据库并读取以本地时区格式读取的功能

那么,我们要查询今天一天的订单,怎么做呢?

Order.where(created_at: Time.now.beginning_of_day..Time.now.end_of_day )

Time.now是本地时区的时间,Rails会自动识别并去掉时区差。

比如北京时区,那么,会beginning_of_day会从今天的00:00变成昨天的16:00,自动减8小时。
同样的,end_of_day也会减8小时,也就是从15:59:59.999999,如下图

image.png

这样就能准确查询出这一天所有的订单

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容