检查Java 8中的两个"Instant"实例是否在同一天

Rob*_*bin 13 java datetime java-8 java-time

我有两个Instant类的实例,java.time例如:

Instant instant1 = Instant.now();
Instant instant2 = Instant.now().plus(5, ChronoUnit.HOURS);
Run Code Online (Sandbox Code Playgroud)

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

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

if (localdate1.equals(localdate2)) {
   // All the awesome
}
Run Code Online (Sandbox Code Playgroud)

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

java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: 2014-11-04T18:18:12Z of type java.time.Instant
Run Code Online (Sandbox Code Playgroud)

这让我回到了1号广场.

如果两个实例Instant具有相同的日期(具有相同的日,月和年),建议/最快的方法是什么?

flo*_*flo 16

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

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");
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用

instant.atOffset(ZoneOffset.UTC).toLocalDate();
Run Code Online (Sandbox Code Playgroud)

  • if (ld2.getDayOfYear() - ld1.getDayOfYear() == 0) {} (2认同)