我希望有一个简单的解决方案来比较Java中的两个Instant对象。比较规则应基于日期而非时间。
public boolean isAfterBasedOnDate(Instant instant, Instant compareTo) {
//TODO
}
例如,
有没有简单的方法呢?
答案 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);
}