ruby - 比较 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 将时间与几分之一秒进行比较(这就是他们所说的“分数”)。例如,
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")