【问题标题】:When should i use DateTime vs date, time fields in ruby/rails?我什么时候应该在 ruby​​/rails 中使用 DateTime 与日期、时间字段?
【发布时间】:2012-02-26 15:40:34
【问题描述】:

我目前有单独的 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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

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

    正如我 explain in another answer 所说,时间的表示比 DateTime 更有限,只能表示截至 2038 年 1 月 18 日的日期和时间。DateTime 可以表示公元前 4,712 年以及未来 21,000 年。

    如果您想要一个单独的字段来表示一天中的时间,这似乎是您可能想要的,您应该创建一个单独的数字字段,如果需要这种精度,则表示午夜过后的秒数,或者更方便的“ HHMM”表示不关心 base-60 和 base-10 之间的差异。

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

    请记住,日期字段是用文字日期填充的,并且与时区无关,因此如果未以用户的本地时间表示,这可能会导致麻烦。如果需要,始终可以将 DateTime 转换为用户的本地时间。

    【讨论】:

    • +1 用于日期字段。 “时间”实际上可以是本地区域中的“日期”,而不是存储在数据库中的“日期”。这使得无法跨不同时区选择“1 月 1 日”发生的所有事情。
    • 关于时间范围限制的注释早于 1.9.3。现在范围要大得多。见stackoverflow.com/questions/1261329/…
    • 内部 Time 类现在可以处理更广泛的范围,这是真的。这些类之间的差异现在已经很小了,但是 DateTime 仍然有更多由 Rails 添加的日期计算方法。
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2021-09-07
    • 2018-06-26
    • 2012-09-22
    相关资源
    最近更新 更多