【问题标题】:How convert LocalDate to ChronoZonedDateTime?如何将 LocalDate 转换为 ChronoZonedDateTime?
【发布时间】:2020-04-10 10:48:29
【问题描述】:

在下面的代码中,我的“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

【问题讨论】:

  • 什么是contract 变量,什么是getBeginAt() 返回?
  • 换个方式试试contract.getBeginAt().toLocalDate().isBefore(taxBegin)
  • 卡罗尔,contract.getBeginAt() 返回一个 ZonedDateTime 值
  • 您的合同是否真的在一天中的特定时间开始?如果是这样,这是在特定时区中指定的,还是作为 Unix 时间指定的?
  • Sunil,我试过你说的,它成功了!谢谢!如果您发布为答案,我将标记为正确的

标签: java date datetime localdate datetime-conversion


【解决方案1】:

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

同一时区:

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

【讨论】:

  • ChronoZonedDateTime.toLocalDate() 为您提供“此日期时间的本地日期部分。这将返回与此日期时间相同的年、月和日的本地日期。” (Javadoc),这意味着它将在纳税日期的时区。这可能与合同开始日期的时区完全无关,也可能不相关。你不能只比较两个 LocalDate,除非你知道它们应该在同一个时区。
  • 嗨欧文。是的,你是对的。我知道……由于用户没有使用LocalDateTime,我觉得没有明确的比较方法。我们可以从ChronoZonedDateTime 中得到ZoneId,但我们不能在LocalDate 中正确使用来进行比较。但是,你说得对,我应该把我的解释说得更清楚。
【解决方案2】:

要将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 之间转换的示例。

【讨论】:

  • 与 Sunil 的回答相同的警告:仅仅因为您将 ChronoZonedDateTime 转换为 LocalDate,并不意味着它与另一个 LocalDate 位于同一时区。您还删除了时间部分,并且您不知道这对于这个特定的业务问题是否有效。税收对象可能特定于另一个字段中存在的特定国家或时区,该字段具有与应在哪一天征税的地区税收规则相关联的特定时间。 OP 的问题是要求之一,而不是将 ZonedDateTime 转换为 LocalDate。
【解决方案3】:

你可以使用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).

【讨论】:

  • 这给出了所要求的转换并作为解决方案工作。我认为在其他两个答案中使用相反的转换更容易。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 2019-01-11
  • 2019-07-22
  • 2015-05-23
  • 2011-06-07
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多