2012-02-04 31 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

相关问题