使用之间的奇怪行为?日期方法

时间:2009-01-10 16:17:38

标签: ruby-on-rails ruby date

打开Rails控制台并输入:

2.weeks.ago.between? 2.weeks.ago, 1.week.ago

它给你的真假吗?不,真的,多试几次,它会给你不同的答案。

现在,我在想,因为我们将2.weeks.ago与2.weeks.ago进行比较,评估这两个语句之间的时间是导致这种行为。

我不能肯定地说,但我猜是介于两者之间?方法不具有包容性,因此如果在两个语句之间经过几毫秒,则上述代码将评估为true,因为它将在两个日期之间进行比较。

但是,如果CPU设法足够快地处理,以便可以忽略经过的时间,那么它将评估为假。

有人可以对此有所了解吗?在一个可能很关键的系统中,这是一个最好的边缘情况,但是当我的测试通过并且看似随机失败时,它让我很头疼。

奇怪的是,这样做不会发生:

 Date.yesterday.between? Date.yesterday, Date.tomorrow

5 个答案:

答案 0 :(得分:5)

原因无疑是由于时间功能的解决。有时,2.weeks.ago的两个实例同时解决,有时则不解决。当你使用昨天时,你看不到问题,因为它总是解析为零小时而不是相对于当前时间。

在像您这样的情况下,您可能只想比较日期,而不是日期和时间。

答案 1 :(得分:1)

tvanfosson,击中头部。

2.weeks.ago给你一个从执行到毫秒的两个星期的时间。因此,对它进行两次评估可以提供两个不同的时间。

执行以下操作可以获得一致的结果:

two_weeks_ago = 2.weeks.ago
two_weeks_ago.between? two_weeks_ago, 1.week.ago

答案 2 :(得分:1)

我只是尝试了这个并且每次都是假的。这个问题背后的意图是什么?我问b / c我在数据库级别做这样的日期比较。

答案 3 :(得分:0)

由于thwt 2.weeks.ago被调用两次,每次都会因处理时间而返回不同的响应。但这有关系吗? between函数完全按预期工作。这种行为并不奇怪,因为如果你使用调试器进入代码,你会看到它完全按照它应该运行。

答案 4 :(得分:0)

尝试做:

two_weeks_ago = 2.weeks.ago.to_date
two_weeks_ago.between? two_weeks_ago, 1.week.ago