【问题标题】:Weird Behavior when using between? method for dates之间使用时的奇怪行为?日期方法
【发布时间】:2010-09-30 16:21:21
【问题描述】:

打开 Rails 控制台并输入:

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

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

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

我不能肯定,但我猜是两者之间?方法不包含在内,因此如果两个语句之间经过了几毫秒,上面的代码将评估为 true,因为它将在两个比较日期之间。

但是,如果 CPU 能够以足够快的速度处理此问题,以至于经过的时间可以忽略,那么它将评估为 false。

任何人都可以对此有所了解吗?在一个可能很关键的系统中,这充其量只是一个边缘情况,但是当我的测试看似随机通过和失败时,这让我很头疼。

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

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

【问题讨论】:

    标签: ruby-on-rails ruby date


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      tvanfosson,打它的头。

      2.weeks.ago 为您提供从执行到毫秒的准确时间两周。因此,对其进行两次评估可能会提供两个不同的时间。

      执行以下操作会得到一致的结果:

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

      【讨论】:

        【解决方案3】:

        我刚试过这个,每次都错了。这个问题背后的意图是什么?我问 b/c 我在数据库级别做这样的日期比较。

        【讨论】:

        • 嗯,我认为我的意图已经很明显地描述了 - 失败的测试用例。我在 Windows 机器上遇到了这个问题;也许这就是原因。
        【解决方案4】:

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

        【讨论】:

        • 是的,它是按照设计的方式工作的。但是当我知道它是否在进行相等或比较时,我感到措手不及。
        【解决方案5】:

        尝试做:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-23
          • 1970-01-01
          • 2019-11-30
          • 2012-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          相关资源
          最近更新 更多