我什么时候应该使用DateTime vs date,ruby / rails中的时间字段?

我目前有单独的game_date和game_time字段,由于时区问题,我有一段时间将我的DateTime.now与连接的DateTime进行比较。 我应该重新设计我的数据库以使用DateTime吗? 我有一个时间字段,因为在某些时间点时间可能为NULL。 什么是典型的做法,以及我应该如何解决以下时区的问题?

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 

一般的想法是使用DateTime作为时间的通用表示。 您可能会感到困惑的是,Time还包含一个日期组件,因为它是对epoch以来的UNIX time_t概念的封装,或者是MySQL术语中的UNIX_TIME()

正如我在另一个答案中解释的那样 ,Time是比DateTime更有限的表示,并且只能表示截至2038年1月18日的日期和时间.DateTime可以代表4,712 BCE以及未来21,000年。

如果你想要一个表示你可能想要的时间的单独字段,你应该创建一个单独的数字字段,表示如果需要那种精度,则表示午夜过了几秒钟,或者更方便的“HHMM”表示这与base-60和base-10之间的差异无关。

另一种方法是有两个字段,一个是DateTime,另一个是Date。 如果您要创建没有特定时间的日历条目,请仅填充日期字段。 如果有时间,请填充两者。

请记住,日期字段使用文字日期填充,并且不涉及时区,因此如果不在用户的本地时间表示,则会导致问题。 如果需要,可以始终将DateTime转换为用户的本地时间。