2009-09-15 17 views
0

我有一個Rails應用程序用於樂隊。樂隊可以導入他們的節目,這些節目都發生在不同的時區。用UTC來存儲這些事件似乎有很多工作要做。我必須確定所創建的任何節目的時區,然後在顯示給用戶時轉換回節目的本地時區。有一個簡單的插件來獲取基於地理定位的UTC偏移量嗎?這可能會有所幫助,但是有沒有人看到我應該以UTC存儲的主要原因?我知道以UTC存儲時間戳可能是一個好主意......但是樂隊活動時間?如何在事件中處理Rails應用程序中的時區

回答

4

我正在做類似的事情 - 一個事件列表的網站。在我的情況下,重要的是讓時間標準化(使用UTC),因爲我們有公佈和出售時間要擔心(即,當事件出現在網站上和出售鏈接出現時),而不僅僅是顯示事件開始時間(它本身並不關心它所在的時區)。

從數據庫中的UTC時間到給定場所的本地時間(即,顯示事件列表中的本地時間)非常簡單,使用沿着e.start.in_time_zone("#{e.venue.time_zone}")行的東西。我無法弄清楚的是,將數據輸入點的本地時間確定爲需要轉換爲UTC的本地時間,而無需處理更改的Time.zone。

我發現有效的東西。看看這篇文章:http://steveluscher.com/archives/changing-a-times-zone-in-rails-keeping-the-same-local-representation。我添加了一個新文件(time_zone_support.rb)到我的config/initializers目錄。以下是內容:

module ActiveSupport 
    class TimeWithZone 
    def zone=(new_zone = ::Time.zone) 
     # Reinitialize with the new zone and the local time 
     initialize(nil, ::Time.__send__(:get_zone, new_zone), time) 
    end 
    end 
end 

這使得在控制檯下:

>> e.starts = Time.zone.parse("2010-09-12 10:00 am") 
=> Sun, 12 Sep 2010 10:00:00 UTC +00:00 
>> e.starts.zone = e.time_zone 
=> "Pacific Time (US & Canada)" 
>> e.starts 
=> Sun, 12 Sep 2010 10:00:00 PDT -07:00 
>> e.save 
=> true 

希望幫助你呢!

+1

僅供參考,這不再有效,因爲get_zone已從時間 – 2012-01-30 16:59:03

+2

中刪除這就是我在Rails 3.2.8中使用的: def same_time_of_day_in_time_zone(zone = :: Time.zone) ActiveSupport :: TimeWithZone.new(nil,:: :Time.find_zone!(zone),self) end – 2012-10-29 21:32:47

-1

一個辦法做到這一點是它們都存儲在UTC,然後讓用戶決定他們希望看到他們在什麼時區。

+0

我想問爲什麼這有-1。然後我看到鏈接頁面是捷克語或其他東西。 – Dan 2014-01-20 02:01:58

1

你不需要在這裏擔心UTC,因爲該事件被捆綁到它發生的時間和地點。如果有人從夏威夷前往舊金山參加晚上8點的節目,這並不意味着節目將在下午4點開始。所以,你可以存儲簡單的時間和位置,不必擔心TZ(因爲大概只有時間和位置的形式)並將其存儲在數據庫中。

就Rails而言,所有的事件都會發生在它所在的TZ中,只是這個有趣的「位置」屬性告訴讀者事件真的在1000米以外。這意味着它可以爲自己做正常的自動TZ轉換,但讀者無法辨別。它首先將轉換爲樂隊輸入的時間。晚上8點+「洛杉磯」,晚上10點+「塔爾薩,好吧。」

這裏的一個問題是,節目是通過互聯網播放的還是類似的,其中的位置與事件分離,在這種情況下你仍然可以進行上述操作,但讓觀衆/潛在觀衆成員選擇他們自己的TZ(或地理定位他們),並讓應用程序在視圖中顯示時進行轉換。

相關問題