Rails时区问题

作者: 柳辉 | 来源:发表于2017-10-10 13:39 被阅读74次

    一个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时区问题

        本文链接:https://www.haomeiwen.com/subject/adxyyxtx.html