我试图比较两个日期datetime
。
closed_at
和updated_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
但数据类型既不同也不时区。
环境:
答案 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 %>