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')
网友评论