Когда я должен использовать DateTime против даты, поля времени в рубине / рельсах? - PullRequest
14 голосов
/ 04 февраля 2012

В настоящее время у меня есть отдельные поля 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 Ответ

22 голосов
/ 04 февраля 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...