2012-02-04 59 views
14

我目前有單獨的game_date和game_time字段,並且由於時區問題,我將我的DateTime.now與級聯的DateTime進行了比較。我應該重新設計我的數據庫來使用DateTime嗎?我有一個時間字段分開,因爲在某些時間點,時間可能爲空。典型的做法是什麼,而且,我應該如何解決我的問題與下面的時區?什麼時候應該在Ruby/Rails中使用DateTime和日期,時間字段?

now = DateTime.now 
    @upcoming_games = [] 
    @past_games = [] 
    games.each do |game| 
     game.game_time = DateTime.now if game.game_time.nil? 
     dt = DateTime.parse("#{game.game_date}T#{game.game_time.strftime("%H:%M:00")}") 
     if dt >= now 
     @upcoming_games << game 
     else 
     @past_games << game 
     end 
    end 

回答

22

一般的想法是使用DateTime作爲時間的通用表示。您可能會對此感到困惑的是,Time還包含日期組件,因爲它是自從epoch以來秒數的UNIX time_t概念的封裝,或者是MySQL條款中的UNIX_TIME()

由於我是explain in another answer,時間是一個比DateTime更有限的表示形式,並且只能表示日期和時間,直到2038年1月18日.D DateTime可以代表公元前4,712年以及21,000年。

如果你想要一個代表時間的單獨字段,你可能需要在這裏創建一個單一的數字字段,表示如果需要這種精度,或者更方便「HHMM」表示不涉及基數-60和基數-10之間的差異。

另一種選擇是有兩個字段,一個是日期時間,一個是日期。如果您創建沒有特定時間的日曆條目,則僅填充日期字段。如果它有時間,那麼填充兩者。

請記住,日期字段使用字面日期填充,並且不會與時區有關,所以如果它不在用戶的本地時間中表示,可能會造成麻煩。如果需要,DateTime總是可以轉換爲用戶的本地時間。

+0

對於日期字段+1。 「時間」實際上可能是本地區域中的不同於數據庫中存儲的「日期」。這使得不可能在不同時區選擇「1月1日」發生的所有事情。 – 2013-02-11 04:46:59

+1

有關時間範圍限制的說明早於1.9.3。範圍現在更大。見http://stackoverflow.com/questions/1261329/whats-the-difference-between-datetime-and-time-in-ruby/1261435#1261435 – 2013-04-10 20:21:45

+0

內部時間類現在可以處理更廣泛的範圍,這是真的。這些類之間的差異現在很小,但是DateTime仍然有更多的Rails添加的日期計算方法。 – tadman 2013-04-10 21:12:31

相關問題