2009-01-10 50 views
3

方法打开一个Rails控制台,输入:之间使用奇怪的行为?对于日期

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

没有给予你真的还是假的?没有,再试几次,它会给你不同的答案。

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

我不能肯定地说,但我猜测之间?方法不是包含性的,所以如果两个语句之间经过了几毫秒,上面的代码将被计算为真,因为它将在两个日期之间进行比较。

但是,如果CPU设法足够快地处理这样的时间,以致过去的时间可以忽略不计,那么它将评估为假。

任何人都可以对此有所了解吗?在这个可能非常重要的系统中,这是一个极好的例子,但是当我的测试通过并且看似随机失败时,这让我头痛。

奇怪的是,这样做的时候不会发生这种情况:

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

回答

5

的原因无疑是由于时间函数的分辨率。有时,2.weeks.ago的两个实例解决同一时间,有时它们不会。当您昨天使用时,您看不到问题,因为它始终会解析为零小时,而不是相对于当前时间。

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

1

tvanfosson,打它的头。

2.weeks.ago给你的时间恰好是从执行到毫秒的两周。所以评估两次可以提供两个不同的时间。

做类似下面会给你一致的结果:

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

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

+0

嗯,我想我的意图是很明显描述 - 失败的测试用例。我在Windows盒子上遇到这个问题;也许这就是原因。 – Jaryl 2009-01-10 20:21:52

0

绝对是由于thwt 2.weeks.ago被调用两次,每次由于处理时间而返回不同的响应。但是这很重要吗? between函数完全按照预期工作。这种行为并不奇怪,因为如果你用调试器加入代码,你会发现它的运行方式应该和它应该的一样。

+0

是的,它按照这种方式设计。但是我知道它是否在做同样的事情 - 或者比较,我感到不知所措。 – Jaryl 2009-01-10 20:25:28

0

尝试这样做:

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