[英]Comparing datetime in Rails always false
我想比较两个都是datetime
时间的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
我读了这两篇文章:
但数据类型和时区都不同。
环境:
这可能发生,因为红宝石时间与秒的分数进行比较。 因此“打印”可能看起来相同,但两个日期之间存在一些时间差异。
尝试使用to_f方法来查看@ task.closed_at和@ task.updated_at之间的区别。 很确定这个问题。
要解决您的问题,只需忽略日期的毫秒部分:
<% if @task.closed_at.to_i == @task.updated_at.to_i %>
*Some stuff*
<% end %>
尝试使用控制台中具有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
。 因此,显示时间时不可见的时间不同。
这是因为这两个变量之间的差异很小(以毫秒为单位)。 关于此问题有一篇博文:
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 %>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.