2010-02-22 19 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 
} 
相關問題