2012-03-10 20 views
21

在Rails 3.x應用程序中,我需要顯示時區縮寫(EST,PST,CST等),而不是全時區名稱。我已經看到了一些似乎解決這個問題的討論,但是過於冗長的舉止。如何將時區全名翻譯爲tz縮寫?

是否有一個寶石或一個非常簡潔的方法來處理這可以用來正確映射它們?

回答

28

對於當前時區:

Time.zone.now.strftime('%Z') 

或者對時區的列表:

ActiveSupport::TimeZone.us_zones.map do |zone| 
    Time.now.in_time_zone(zone).strftime('%Z') 
end 

它的工作原理,但它仍然似乎應該有更好的辦法...

+1

如果您找到更好的解決方案,請告訴我。感謝分享。 – ylluminate 2012-10-25 05:55:46

+0

這肯定會在以下情況下失敗 2.2.2:059> Time.now.in_time_zone(「Indiana(East)」)。strftime('%Z') =>「EDT」 2.2.2:060> Time (「美國和加拿大」)。strftime('%Z') =>「EDT」 – AMBasra 2015-10-30 16:23:18

2

那麼,如果你讓你的用戶選擇自己的時區,你可以把時區縮寫作爲日期時間格式的一部分。嘗試這樣的事情在你appliction_helper.rb,然後用它在一個視圖來格式化DateTime對象:

def format_datetime(datetime) 
    datetime.strftime "%-d %b %Y, %H:%M %Z" 
end 

更新

如果您是根據用戶的IP地址做的地理位置,然後您可以根據該位置進行時區查找。這個問題之前已經被問過,但是關於緯度/經度而不是所給時區的名稱。

有這一個的讀:Timezone lookup from latitude longitude

+0

我通過拉在自己的時區ip +地理位置檢測,所以我正在從更長的名字解決它。 – ylluminate 2012-03-10 15:52:21

+0

其實我的問題有點特別。我的地理位置工作得很好。目前的問題是,結果是時區的更長版本。我期待得到EST(EDT),PST(PDT),UTC,IST等。 – ylluminate 2012-03-17 08:18:43

5
Time.now.zone 
# => "UTC" 

要使用默認時區(如果設置),可以使用:對

Time.zone.now.zone 
# => "CDT" 

更多信息:http://api.rubyonrails.org/classes/Time.html#method-c-zone-3D

+0

這在以下情況下也會失敗 Time.now.in_time_zone(「Eastern Time(US&加拿大)」)。區域 =>「EDT」 2.2.2:065> Time.now.time_time_zone(「Indiana(East)」)。區域 =>「EDT」 對於日光節約和區域具有相同的時間上面提到的兩個區都是GMT -5。所以紅寶石很困惑。 – AMBasra 2015-10-30 16:26:20

4

我到處尋找這個答案,我終於找到了我一直在尋找。我在這裏留下了答案,所以其他人可能不必像我所需要的那樣長時間和艱苦地看待。

如果你有機會獲得的ActiveSupport和處理這樣的TimeZone對象:

timezone = ActiveSupport::TimeZone.all[44] 

那麼你可以得到的縮寫是這樣的:

timezone.tzinfo.current_period.abbreviation 
+0

區域信息是在tzinfo中,但是這基本上是一個更簡單的方法,只是做上面提到的ifightcrime ...例如,User.take.created_at.zone – hellion 2016-02-27 01:03:30

+0

您也可以使用'strftime'直接從'TZInfo :: TimezoneProxy'實例。 – roflmyeggo 2016-12-01 22:20:03