一个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,如下图
这样就能准确查询出这一天所有的订单