我目前有单独的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()在MysqL术语中的UNIX time_t概念的封装.
在explain in another answer时,Time是一个比DateTime更有限的表示,只能代表到2038年1月18日的日期和时间.DateTime可以代表公元4,712年以及将来的21,000年.
如果您想要一个单独的字段,代表一天中的时间,您可能希望在这里,您应该创建一个单个数字字段,代表需要这种精度的午夜之间的秒数,或者更方便的“HHMM”表示这不关心基础60和基础10之间的差异.
另一个选择是有两个字段,一个是DateTime,一个是Date.如果您创建一个没有特定时间的日历项,只填充日期字段.如果它有一个时间,填充两者.
请记住,日期字段填充有文字日期,并不关心时区,因此如果在用户本地时间没有表达,可能会导致麻烦.如果需要,DateTime总是可以转换为用户的本地时间.