首页 > 解决方案 > 比较 ruby​​ 中的 DateTimes,你能回答这个难题吗?

问题描述

这怎么可能?

在此处输入图像描述

比较两个具有明显相似值的 DateTime 类,我得到了一个令人惊讶的答案。

索引器友好信息:

[9] pry(#<Api::Requests::Schemas::PickupRequestContract>)> scheduled_shift.start_at
=> Sat, 20 Jul 2019 19:28:40 +0000
[10] pry(#<Api::Requests::Schemas::PickupRequestContract>)> value
=> Sat, 20 Jul 2019 19:28:40 +0000
[11] pry(#<Api::Requests::Schemas::PickupRequestContract>)> scheduled_shift.start_at.class
=> DateTime
[12] pry(#<Api::Requests::Schemas::PickupRequestContract>)> value.class
=> DateTime
[13] pry(#<Api::Requests::Schemas::PickupRequestContract>)> value.to_i
=> 1563650920
[14] pry(#<Api::Requests::Schemas::PickupRequestContract>)> scheduled_shift.start_at.to_i
=> 1563650920
[15] pry(#<Api::Requests::Schemas::PickupRequestContract>)> scheduled_shift.start_at == value
=> false
[16] pry(#<Api::Requests::Schemas::PickupRequestContract>)> scheduled_shift.start_at.to_date == value.to_date
=> true
[17] pry(#<Api::Requests::Schemas::PickupRequestContract>)>

更多信息:

[17] pry(#<Api::Requests::Schemas::PickupRequestContract>)> scheduled_shift.start_at.to_time
=> 2019-07-20 19:28:40 +0000
[18] pry(#<Api::Requests::Schemas::PickupRequestContract>)> value.to_time
=> 2019-07-20 19:28:40 +0000
[19] pry(#<Api::Requests::Schemas::PickupRequestContract>)> scheduled_shift.start_at.to_time == value.to_time
=> false

似乎时间部分是有罪的。但是怎么做?

从时间文档https://ruby-doc.org/core-2.6.3/Time.html

All times may have fraction. Be aware of this fact when comparing times with each other – times that are apparently equal when displayed may be different when compared.

那么这个分数在哪里,又是如何搞砸的呢?

标签: ruby

解决方案


Ruby 将时间与几分之一秒进行比较(这就是他们所说的“分数”)。例如,

t0, t1 = Time.now, Time.now
t0 == t1
# => false

或者

t0, t1 = DateTime.now, DateTime.now
t0 == t1
# => false

如果您使用to_f,您将看到几分之一秒的差异。

现在,如果你这样做:

t0, t1 = Time.now, Time.now
t0 = Time.at(t0.to_i)
t1 = Time.at(t1.to_i)
t0 == t1
# => true

这将起作用,因为您正在创建一个没有几分之一秒的新时间戳。

此外,如果您有兴趣直接检查秒数:

Time.now.strftime("%N")

推荐阅读