Rails 在国际化过程中时区问题的处理

1. 在请求的时候开始的时候重置 TimeZone

#ApplicationController
around_action:set_time_zone

def set_time_zone
    old_time_zone = Time.zone
    Time.zone = current_user.timezone if user_signed_in?
    Stripe.api_key = Setting.value('stripe_api_secret_key')
    begin
      yield
    ensure
      Time.zone = old_time_zone
    end
 end

2. 调用

要定义一个 DATE_FOMATE, 默认的 to_s(:db) 调用的是UTC 的时间,并不会根据时区发生变化

#initiallizers/time_format.rb
Time::DATE_FORMATS.merge!(
  :localdb => '%Y-%m-%d %H:%M:%S'
  }
)

#调用
current_user.created_at.to_s(:localdb)

3. 涉及夏令时的处理

翻译叫 daylight savings time, 指美国等地区在夏季天亮的早的时候,拨快一个钟,冬天的时候再拨回来,rails 已经处理了这个问题,在存数据库的时候就已经转换好了,这里列举几个可能用到的方法

#新建 timezone
new_zone = ActiveSupport.new('Alaska')

#用 Alaska 的 zone 解析时间
time = new_zone.parse("2000-1-1")
#=> Sat, 01 Jan 2000 00:00:00 AKST -09:00

new_zone.now
#=> Fri, 30 Sep 2016 20:25:15 AKDT -08:00

#判断是否是夏令时, Rails 提供的方法
new_zone.parse("2000-1-1").dst?

#某个时间的所处的时令的开始和结束
tz = ActiveSupport::TimeZone[timezone].tzinfo.period_for_utc(time)
tz.local_end
#=> Sun, 02 Apr 2000 02:00:00 +0000
tz.local_start
#=> Sun, 31 Oct 1999 01:00:00 +0000

#转换时区
Time.now.in_time_zone('Alaska')

你可能感兴趣的:(Rails 在国际化过程中时区问题的处理)