Когда следует использовать 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

Ответы

Ответ 1

Общая идея - использовать DateTime как представление времени общего назначения. Там, где вы можете быть смущены, это то, что Time также включает компонент даты, поскольку он представляет собой инкапсуляцию концепции UNIX time_t секунд с эпохи или UNIX_TIME() в терминах MySQL.

Как я объясняю в другом ответе, Time является более ограниченным представлением, чем DateTime, и может представлять только даты и время до 18 января 2038 года. DateTime может представлять 4,712 BCE, а также 21 000 лет в будущем.

Если вам требуется отдельное поле, которое представляет время дня, которое, как вам кажется, вам может понадобиться, вы должны создать одно числовое поле, которое представляет собой секунды за полночь, если требуется такая точность, или более удобная "HHMM", которая не касается различий между базой-60 и базой-10.

Другой альтернативой является наличие двух полей, один из которых является DateTime, а другой - Date. Если вы создаете запись календаря без определенного времени, заполните только поле "Дата". Если у него есть время, заполните оба.

Помните, что поле даты заполняется литеральной датой и не касается часовых поясов, поэтому это может вызвать проблемы, если оно не выражено в локальном времени пользователя. DateTime всегда может быть преобразован в локальное время пользователя, если требуется.