如何将 LocalDate 转换为 ChronoZonedDateTime?

How convert LocalDate to ChronoZonedDateTime?

在下面的代码中,我的 "if" 比较出现错误。该消息显示“isBefore(java.time.chrono.ChronoZonedDateTime<?>) in ChronoZonedDateTime cannot be applied to (java.time.LocalDate)”。如何将 LocalDate 转换为 ChronoZonedDateTime?

LocalDate taxBegin = tax.getBeginAt();

if(contract.getBeginAt().isBefore(taxBegin)){
    //do something
}

我试过像 ChronoZonedDateTime.from(taxBegin) 那样换行但是没有用,它给了我“DateTimeException: Unable to obtain ZoneId from TemporalAccessor: 2019-12-01 of type java.time.LocalDat

你可以使用 atStartOfDay(ZoneId)

public static ZonedDateTime convertLocalDate(final LocalDate ld) {
    return ld.atStartOfDay(ZoneId.systemDefault());
}

您可以使用 ZoneId.systemDefault()ZoneOffset.UTC
文档说明:如果区域 ID 是 ZoneOffset,则结果始终为午夜时间。
所以你的代码将是

if (contract.getBeginAt().isBefore(convertLocalDate(taxBegin))) {
    //do something
}

如果你想把它转换成一个特定的时间,你应该使用 taxBegin.atTime(LocalTime).atZone(ZoneId).

要将 ZonedDateTime 对象转换为 LocalDate,您可以使用 toLocalDate() 方法。因此,以下代码应该适合您:

LocalDate taxBegin = tax.getBeginAt();

if(contract.getBeginAt().toLocalDate().isBefore(taxBegin)){
    //do something
}

查看 https://howtodoinjava.com/java/date-time/localdate-zoneddatetime-conversion/ 以获取 ZonedDateTimeLocalDate 之间转换的示例。

如果你有 LocalDateTime 而不是 LocalDate,它会工作得很好。但是既然你有LocalDate,你就浪费了时间。现在唯一的办法就是将现有的ChronoZonedDateTime转换为LocalDate并进行比较。但是,如果时区不同,这可能并不总是有效。

同一时区:

contract.getBeginAt().toLocalDate().isBefore(taxBegin)