如何根据日期而不是时间来比较两个Instant

时间:2015-01-07 06:33:08

标签: java

我希望有一个简单的解决方案来比较Java中的两个Instant对象。比较规则应基于日期而非时间。

public boolean isAfterBasedOnDate(Instant instant, Instant compareTo) {
//TODO
}

例如,

  • 瞬间: 2013-01-03T00:00:00Z
  • 即时(比较): 2013-01-03T15:00:00Z
  • isAfterBasedOnDate返回 false

  • 瞬间: 2013-01-03T15:00:00Z
  • 即时(比较): 2013-01-30T00:00:00Z
  • isAfterBasedOnDate返回 true

有没有简单的方法呢?

4 个答案:

答案 0 :(得分:12)

Instant截断为天数,然后比较截断的值。

  public static void main(String[] args) {
    Instant now = Instant.now();
    System.out.println(now);
    Instant truncated = now.truncatedTo(ChronoUnit.DAYS);
    System.out.println(truncated);
  }
2015-01-07T06:43:30.679Z
2015-01-07T00:00:00Z

答案 1 :(得分:3)

使用Instant对象上的truncatedTo - 方法仅获取天数。

public boolean isAfterBasedOnDate(Instant instant, Instant compareTo) {
    return instant.truncatedTo(ChronoUnit.DAYS)
                  .isAfter(compareTo.truncatedTo(ChronoUnit.DAYS));
}

@Test
public void test() {
    Assert.assertFalse(isAfterBasedOnDate(
            Instant.parse("2013-01-03T00:00:00Z"),
            Instant.parse("2013-01-03T15:00:00Z")));

    Assert.assertFalse(isAfterBasedOnDate(
            Instant.parse("2013-01-03T15:00:00Z"),
            Instant.parse("2013-01-03T00:00:00Z")));

    Assert.assertFalse(isAfterBasedOnDate(
            Instant.parse("2013-01-02T15:00:00Z"),
            Instant.parse("2013-01-03T00:00:00Z")));

    Assert.assertTrue(isAfterBasedOnDate(
            Instant.parse("2013-01-04T15:00:00Z"),
            Instant.parse("2013-01-03T00:00:00Z")));
}

答案 2 :(得分:0)

虽然接受的答案是正确的,但阅读此问题的用户应重新考虑是否应在这种情况下使用即时。 LocalDate是存储和比较与时间无关的日期的合适方法。截断的即时有效,但从本质上讲仍然隐含着不相关的时区。

答案 3 :(得分:0)

以一种简单的方式,您可以像这样以秒精度将其与Java中的Instant进行比较:

   public boolean isAfterBasedOnDate(Instant instant, Instant compareTo) {
       return instant.getEpochSecond() - compareTo.getEpochSecond() > 0;
   }

如果需要纳米精度,可以简单地使用以下方法:

public boolean isAfterBasedOnDate(Instant instant, Instant compareTo) {
        long secondDiff = instant.getEpochSecond() - compareTo.getEpochSecond();
        return secondDiff > 0
                || (secondDiff == 0 && instant.getNano() - compareTo.getNano() > 0);
    }