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

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

你可能感兴趣的:(Rails时区问题)