我有一个变量start_time:
(rdb:5) start_time.class
ActiveSupport::TimeWithZone
(rdb:5) start_time
Tue, 23 Feb 2010 14:45:00 EST -05:00
(rdb:5) start_time.in_time_zone(ActiveSupport::TimeZone::ZONES_MAP["Pacific Time (US & Canada)"]).zone
"PST"
(rdb:5) start_time.in_time_zone(ActiveSupport::TimeZone::ZONES_MAP["Pacific Time (US & Canada)"]).to_s(:time)
"2:45 PM ET"
我想更改'to_s(:time)',以便它在变量中指定的任何区域输出时间,而不是默认的系统时间。即输出将是“上午11:45 PT”。我该怎么做?
答案 0 :(得分:3)
我认为您要创建一个TimeZone
对象,并使用其at()
方法:
start_time = Time.now
start_time.rfc822 # => "Tue, 23 Feb 2010 10:58:23 -0500"
pst = ActiveSupport::TimeZone["Pacific Time (US & Canada)"]
pst.at(start_time).strftime("%H:%M %p %Z") # => "08:00 AM PST"
答案 1 :(得分:2)
我最近遇到了这个问题,并且能够通过基本上覆盖我正在使用的.to_s
选项来解决它。我创建了一个名为time_formats.rb的初始化程序,并在其中添加了以下行。
Time::DATE_FORMATS[:time_in_zone] = "%H:%M %p"
然后将(:time)
更改为(:time_in_zone)
,就像这样......
start_time.in_time_zone(...your timezone here...]).to_s(:time_in_zone)
应该给你指定区域的时间。我的环境是UTC,所以也许这与它有关...
答案 2 :(得分:0)
鉴于Beerlington的评论,我最后添加了以下内容(类似于Proc定义的Time :: DATE_FORMATS [:time]
:time_in_zone => lambda { |time|
time = time.strftime("%I:%M %p %Z").gsub(/([NAECMP])([DS])T$/, '\1T')
time = time[1..-1] if time =~ /^0/ # drop leading zeroes
time
}