【问题标题】:Comparing datetime in Rails always false在 Rails 中比较日期时间总是错误的
【发布时间】:2015-10-30 16:20:58
【问题描述】:

我正在尝试比较两个日期,其中两个日期都是datetime

closed_atupdated_at(而 updated_at 是 rails 已经创建的)

这是我的代码:

<% if @task.closed_at == @task.updated_at %>
    *Some stuff*
<% end %>

关闭任务后,它会自动更新。

irb(main):011:0> Task.first.closed_at
=> Fri, 07 Aug 2015 10:47:58 CEST +02:00

irb(main):012:0> Task.first.updated_at
=> Fri, 07 Aug 2015 10:47:58 CEST +02:00

irb(main):013:0> Task.first.closed_at == Task.first.updated_at
=> false

irb(main):014:0> Task.first.closed_at.to_datetime == Task.first.updated_at.to_datetime
=> false

我已经阅读了这两个帖子:

comparing datetime and time produces a false result

DateTime comparison fails in Rails

但是数据类型和时区都不同。

环境:

  • 红宝石 2.2.2p95
  • 导轨 4.2.3
  • 第 0.18.2 页

【问题讨论】:

    标签: ruby-on-rails postgresql datetime


    【解决方案1】:

    这可能会发生,因为 ruby​​ Time 以秒为单位进行比较。所以“打印”可能看起来相同,但两个日期之间存在一些时间差。

    尝试使用 to_f 方法查看@task.closed_at 和@task.updated_at 的区别。很确定是这个问题。

    要解决您的问题,只需忽略日期的毫秒部分:

    <% if @task.closed_at.to_i == @task.updated_at.to_i %>
        *Some stuff*
    <% end %>
    

    【讨论】:

      【解决方案2】:

      对任何在控制台中具有 created_at 和 updated_at 的模型尝试这个小实验:

      user = User.new
      user.created_at = 'Fri, 07 Aug 2015 10:47:58 CEST +02:00'.to_datetime
      user.updated_at = 'Fri, 07 Aug 2015 10:47:58 CEST +02:00'.to_datetime
      user.created_at == user.updated_at
      

      上面的最后一条语句返回true。所以显示时间的时候一定会有时间不可见的差异。

      【讨论】:

        【解决方案3】:

        这是因为这两个变量之间的差异很小(以毫秒为单位)。关于这个问题有一篇博文:

        http://railsware.com/blog/2014/04/01/time-comparison-in-ruby/

        基本上,一个简单的解决方法是将时间值转换为 int:

        <% if @task.closed_at.to_i == @task.updated_at.to_i %>
            *Some stuff*
        <% end %>
        

        【讨论】:

          猜你喜欢
          • 2017-06-28
          • 1970-01-01
          • 2018-05-29
          • 1970-01-01
          • 2013-02-04
          • 2014-03-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          相关资源
          最近更新 更多