2010-02-22 17 views
4

我有一个变量,START_TIME:在Rails中,如何将时间转换并打印到不同的时区?

(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(:时间)”,使其输出在任何区域的变量,而不是默认的系统时指定的时间。即输出将是“上午11:45 PT”。我该怎么做呢?

+0

Touche。我应该为此做点什么。 – 2010-02-23 15:31:34

回答

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,所以也许这有一些东西需要用它做...

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" 
0

鉴于Beerlington的意见,我最终添加了以下内容(与Time:DATE_FORMATS [:time]定义的Proc类似):

: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 
} 
相关问题