【问题标题】:Given an instance of Calendar, what is the simplest way to determine if it is one hour old?给定一个日历实例,确定它是否是一小时前的最简单方法是什么?
【发布时间】:2011-10-10 15:43:57
【问题描述】:

在代码块中寻找一些微妙的、烦人的错误。

此代码提供了一个日历实例,该实例是在某个事件开始时创建的。我们需要确定这个事件是否存在一个小时。

我知道有几种方法可以做到这一点:

  • 使用 JodaTime 并计算持续时间
  • 将给定日历与一小时前创建的新日历进行比较
  • 将给定的 Calendar.getTime 与一小时前创建的日期进行比较

这些方法中的每一个都有自己的怪癖,并且似乎有代码味道。在 Java 中是否有一种简单、简洁的方式来表达“从现在到一小时前发生的事情”?

当我对此进行单元测试时,我会检查:

  • 45 分钟前(真实)
  • 61 分钟前(假)
  • 0 分钟前(真实)
  • -1 分钟前(错误还是正确?)

【问题讨论】:

  • 您可以在给定当前时间的情况下创建一个日历,将其回滚一小时,然后使用日历的 compareTo 方法 - 未尝试但可能有效。

标签: java date time comparison


【解决方案1】:

您可以创建一个新的日历实例(使用当前日期/时间)并将其与给定的实例进行比较:

public boolean isWithinHour(Calendar given)
{
    long oldTime = given.getTimeInMillis();
    long newTime = Calendar.getInstance().getTimeInMillis();

    long diff = newTime - oldTime;
    return (diff <= 3600 * 1000);    // 3600 seconds in millis
}

【讨论】:

    【解决方案2】:

    作为个人偏好,我会选择 Joda-Time,但我认为实施并不重要。重要的是明确目的并创建可以使用的方法。

    首先你最好定义含义 happened one hour ago

    • 是指一小时前吗?
    • 是指一小时前吗?
    • 是指 45 分钟前到 1 小时 15 分钟前吗?

    之后,您选择您提到的一种方法。然后您编写自己的具有描述性名称的方法,该名称应该在您的代码中自然阅读。

    【讨论】:

      【解决方案3】:

      可能与您列出的方法没有太大区别,但我不明白它的味道或原因:

      if (calendar.getTimeInMillis() + (60L * 60L * 1000L)) <= System.currentTimeMillis()) {
          // created more than one hour ago
      }
      

      【讨论】:

      • “代码气味”很微弱。它来自于对可以使用的各种 Calendar、Date、Time 和 Joda Time 类的普遍不安,以及对时区、闰年等更普遍的担忧。为了消除那种微弱的代码气味,一个简单的明确声明是最好的。我认为这种 getMillis 方法接近于此。
      【解决方案4】:

      我将使用的方法是与过去 1 小时的时间戳进行比较:

      return cal.getTimeInMillis() < (System.currentTimeMillis() - 1000L * 60L * 60L);
      

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 2017-05-01
        • 1970-01-01
        • 2010-09-12
        相关资源
        最近更新 更多