问题 检查Java 8中的两个“Instant”实例是否在同一天


我有两个实例 Instant 来自 java.time 比如这样:

Instant instant1 = Instant.now();
Instant instant2 = Instant.now().plus(5, ChronoUnit.HOURS);

现在我想检查两个实例是否存在 Instant 实际上是在同一天(日,月和年匹配)。我想,我只想使用闪亮的新品 LocalDate 和普遍的 from 静态方法:

LocalDate localdate1 = LocalDate.from(instant1);
LocalDate localdate2 = LocalDate.from(instant2);

if (localdate1.equals(localdate2)) {
   // All the awesome
}

除了普遍的 from 方法不是那么通用,Java在运行时抱怨异常:

java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: 2014-11-04T18:18:12Z of type java.time.Instant

这让我回到了1号广场。

什么是推荐/最快的方式检查是否有两个实例 Instant 实际上有相同的日期(有相同的日,月和年)?


3604
2018-01-15 16:09


起源

换句话说,你需要一些适用于Java 7的东西吗? Java 6或Java 5怎么样?你需要多长时间才能工作? - markspace
这只需要在我的情况下适用于Java 8,应该已经指定了 - Robin
如何使用 instant1.truncatedTo(ChronoUnit.DAYS)?在instant2上做同样的事情并比较截断的实例? - dcsohl
这个答案 解释了如何转换 Instant 至 LocalDate。 LocalDate.from 不起作用,因为 Instant 不包括时区。 - default locale
@defaultlocale:太好了,这有帮助!现在问题仍然是这是最快的方式(但我现在就把它拿走):) - Robin


答案:


Instant类不适用于人类时间单位,例如   年,月或日。如果你想在那些中进行计算   单位,你可以将一个瞬间转换为另一个类,如   LocalDateTime或ZonedDateTime,通过将Instant与时间绑定   区。然后,您可以按所需的单位访问该值。

http://docs.oracle.com/javase/tutorial/datetime/iso/instant.html

因此我建议使用以下代码:

LocalDate ld1 = LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()).toLocalDate();
LocalDate ld2 = LocalDateTime.ofInstant(instant2, ZoneId.systemDefault()).toLocalDate();

if (ld1.isEqual(ld2)) {
    System.out.println("blubb");
}

或者你可以使用

instant.atOffset(ZoneOffset.UTC).toLocalDate();

12
2018-01-15 16:28



if(ld2.getDayOfYear() - ld1.getDayOfYear()== 0){} - egemen
@egemen,只能在同一年内使用 - flo
你是对的。 - egemen