rails 中的时区问题

UTC 为协调世界时。

维基百科世界时区划分图

其中东西十二区各站7.5度。

UTC 与当地时间转换 在东时区UTC时间 加上所在时区时差, 在西时区 UTC时间减去相应的时区时差


默认情况下 rails 存取时间都会转换为UTC时间。
config.time_zone 设置应用的时区,ActiveRecord 取时间时根据这个设置自动转换
config.active_record.default_timezone = :local rails 往数据库存时间时根据time_zone配置的时区存时间。
default_timezone应该和time_zone一起使用并且time_zone应该在default_timezone前面。


注意在rails console 中 显示Model Object的时候 时间调用了 TimeWithZone#to_s(:db),此时显示的是utc时间,不一定是数据库存储的时间。可以使用pry-rails

def to_s(format = :default)
  if format == :db
    utc.to_s(format)
  elsif formatter = ::Time::DATE_FORMATS[format]
    formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter)
  else
    "#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}" # mimicking Ruby Time#to_s format
  end
end

建议:
在往数据库存数据的时候default_timezone使用UTC,time_zone根据情况设置。
因为存的是UTC时间在以后更方便转换成任意时区,尤其是系统面向多个时区时,在向别的系统提供数据时也更方便。


Rails 中的时区及时间问题
关于 Rails 中奇怪的时区问题

推荐阅读更多精彩内容