繁体   English   中英

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

[英]Comparing datetime in Rails always false

我想比较两个都是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

我读了这两篇文章:

比较日期时间和时间会产生错误的结果

Rails中的DateTime比较失败

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

环境:

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

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

尝试使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM