比较Rails中的日期时间总是错误的

时间:2015-08-07 09:18:24

标签: ruby-on-rails postgresql datetime

我试图比较两个日期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

但数据类型既不同也不时区。

环境:

  • ruby​​ 2.2.2p95
  • rails 4.2.3
  • pg 0.18.2

3 个答案:

答案 0 :(得分:2)

这可能发生,因为红宝石时间与几分之一秒进行比较。因此“打印”可能看起来相同,但两个日期之间存在一些时间差异。

尝试使用to_f方法查看@ task.closed_at和@ task.updated_at之间的区别。非常肯定是这个问题。

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

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

答案 1 :(得分: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。因此,显示时间时不可见的时间会有所不同。

答案 2 :(得分:1)

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

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 %>