检查 Java 8 中“即时”的两个实例是否在同一日期

2022-09-02 13:23:42

我有两个即时类的实例,如下所示:java.time

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

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

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

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

除了通用方法不是那么通用,Java在运行时会抱怨,但有一个例外:from

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

这让我回到了原点1。

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


答案 1

即时类不适用于人工时间单位,例如年、月或天。如果要以这些单位执行计算,可以通过将即时与时区绑定,将 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");
}

或者,您可以使用

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

答案 2