.days.ago.to_date上的奇怪行为) - Ruby

时间:2014-03-07 02:47:56

标签: ruby date comparison

有人能帮助我理解这个吗? 当我尝试使用以下代码时,我得到一个非常奇怪的行为(反向逻辑)。

c = {
 id: 5,
 years_of_experience: 4,
 github_points: 293,
 languages: ['C', 'Ruby', 'Python', 'Clojure'],
 date_applied: 5.days.ago.to_date,
 age: 26
}

c["date_applied"] > 15.days.ago.to_date) - #works
c["date_applied"] < 15.days.ago.to_date) - #doesnt work

“date_applied person applied”是存储在哈希

中的值

后者更符合逻辑,但第一个返回正确的答案。

旁注:我确实要求'active_support / all'。

由于

2 个答案:

答案 0 :(得分:1)

  

irb ## ruby​​-1.9.3-p448

     

要求'active_support / time'

c = {
 id: 5,
 years_of_experience: 4,
 github_points: 293,
 languages: ['C', 'Ruby', 'Python', 'Clojure'],
 date_applied: 5.days.ago.to_date,
 age: 26
}
(c[:date_applied] > 15.days.ago.to_date) - #true
(c[:date_applied] < 15.days.ago.to_date) - #false

或者您可以通过添加自己的私有方法

来尝试
class Fixnum
  def days
     self * 60 * 60 * 24   # we store seconds in a day
  end

  def ago
    Time.now - self
  end
end

答案 1 :(得分:0)

我想我理解这个问题。

您正在阅读

c["date_applied"] > 15.days.ago`

为:

日期是否超过15天?

`c["date_applied"] < 15.days.ago`

为:

申请日期是否少于15天?

它会给你你想要的答案的反面,对吗?


如果是这种情况,您应该花点时间了解时间比较的运作方式。当您输入date1 > date2时,实际上是在说,

如果我在数字线上绘制date1date2,时间从左到右增加,
date1的右侧是date2

这与您键入2 > 1时相同。这意味着,

如果我在数字线上绘制12,数字从左到右增加,
2右侧的1


鉴于这是时间比较的运作方式,让我们重新审视您的代码。

require 'active_support/all'

c = { date_applied: 5.days.ago }

c[:date_applied] > 15.days.ago

正确解释,这说

5天前的日期是否在从左到右的时间轴上比15天前的日期更向右?

答案是肯定的,或true

另一方面,如果您错误将其解释为

是5天前超过15天前的吗?

你会得到(或期望得到)错误的答案,或false


询问相当于英文问题的正确方法

约会x是否超过y天前?

是(可能违反直觉的)x.to_date < y.days.ago.to_date构造,应该正确地理解为

日期x早于y天前的日期?


如果我理解你的问题,这应该解释它。