Java 如何将LocalDate转换为ChronoZonedDateTime?
在下面的代码中,我的“如果”比较中出现了一个错误。消息中说“Java 如何将LocalDate转换为ChronoZonedDateTime?,java,date,datetime,localdate,datetime-conversion,Java,Date,Datetime,Localdate,Datetime Conversion,在下面的代码中,我的“如果”比较中出现了一个错误。消息中说“ChronoZonedDateTime中的isBefore(java.time.chrono.ChronoZonedDateTime)不能应用于(java.time.LocalDate)”。如何将LocalDate转换为ChronoZonedDateTime LocalDate taxBegin = tax.getBeginAt(); if(contract.getBeginAt().isBefore(taxBegin)){
ChronoZonedDateTime中的isBefore(java.time.chrono.ChronoZonedDateTime)不能应用于(java.time.LocalDate)
”。如何将LocalDate转换为ChronoZonedDateTime
LocalDate taxBegin = tax.getBeginAt();
if(contract.getBeginAt().isBefore(taxBegin)){
//do something
}
我尝试像ChronoZonedDateTime.from(taxBegin)
那样包装,但没有成功,它给了我“DateTimeException:无法从临时Accessor:2019-12-01获取java.time.LocalDat类型的ZoneId”
即
您可以使用ZoneId.systemDefault()
或ZoneOffset.UTC
文档说明:如果区域ID是一个区域偏移,则结果的时间始终为午夜。
所以你的代码将是
if (contract.getBeginAt().isBefore(convertLocalDate(taxBegin))) {
//do something
}
如果要将其转换为特定时间,应使用
taxBegin.atTime(LocalTime).atZone(ZoneId)
您可以使用
即
您可以使用ZoneId.systemDefault()
或ZoneOffset.UTC
文档说明:如果区域ID是一个区域偏移,则结果的时间始终为午夜。
所以你的代码将是
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
}
检查在ZonedDateTime
和LocalDate
之间转换的示例要将ZonedDateTime
对象转换为LocalDate
,可以使用toLocalDate()
方法。因此,以下代码应该适用于您:
LocalDate taxBegin = tax.getBeginAt();
if(contract.getBeginAt().toLocalDate().isBefore(taxBegin)){
//do something
}
检查在ZonedDateTime
和LocalDate
之间转换的示例。如果您使用LocalDateTime
而不是LocalDate
,则可以正常工作。但是因为您有LocalDate
,所以您浪费了时间。现在唯一的方法是将现有的ChronoZonedDateTime
转换为LocalDate
并进行比较。但是,如果时区不同,这可能并不总是有效
同一时区:
contract.getBeginAt().toLocalDate().isBefore(taxBegin)
如果您使用的是LocalDateTime
,而不是LocalDate
,它就可以正常工作了。但是因为您有LocalDate
,所以您浪费了时间。现在唯一的方法是将现有的ChronoZonedDateTime
转换为LocalDate
并进行比较。但是,如果时区不同,这可能并不总是有效
同一时区:
contract.getBeginAt().toLocalDate().isBefore(taxBegin)
什么是contract
变量,什么是getBeginAt()
返回?尝试另一种方法contract.getBeginAt().toLocalDate().isBefore(taxBegin)
Karol,contract.getBeginAt()返回ZonedDateTime值您的合同真的在一天中的特定时间开始吗?如果是这样的话,这是在特定的时区内指定的,还是作为Unix时间指定的?Sunil,我尝试了你所说的,并且成功了!非常感谢。如果您作为答案发布,我会将什么是contract
变量以及什么是getBeginAt()
返回标记为正确答案?请尝试另一种方法contract.getBeginAt().toLocalDate().isBefore(taxBegin)
Karol,contract.getBeginAt()返回区域日期值您的合同真的是在一天中的特定时间开始的吗?如果是这样的话,这是在特定的时区内指定的,还是作为Unix时间指定的?Sunil,我尝试了你所说的,并且成功了!非常感谢。如果您作为答案发布,我将标记为正确的ChronoZonedDateTime.toLocalDate()
为您提供“此日期时间的本地日期部分。此返回的本地日期与此日期时间具有相同的年、月和日。”(),这意味着它将位于纳税日期的时区内。可能与合同开始日期的时区完全无关,也可能与之无关。你不能只比较两个LocalDate,除非你知道它们应该在同一个时区。是的,你是对的。我知道。。。由于用户没有使用LocalDateTime
,我觉得没有明确的方法进行比较。我们可以从ChronoZonedDateTime
中获取ZoneId
,但是我们无法在LocalDate
中正确地进行比较。但是,你是对的,我应该把我的解释说得更清楚。ChronoZonedDateTime.toLocalDate()
提供了“此日期时间的本地日期部分。它返回一个与此日期时间相同的年、月、日的本地日期。”(),这意味着它将在纳税日期的时区内。可能与合同开始日期的时区完全无关,也可能与之无关。你不能只比较两个LocalDate,除非你知道它们应该在同一个时区。是的,你是对的。我知道。。。由于用户没有使用LocalDateTime
,我觉得没有明确的方法进行比较。我们可以从ChronoZonedDateTime
中获取ZoneId
,但是我们无法在LocalDate
中正确地进行比较。但是,你是对的,我应该把我的解释解释得更清楚。同样的警告适用于Sunil的回答:仅仅因为你将ChronoZonedDateTime转换为LocalDate,并不意味着它与另一个LocalDate在同一时区是本地的。您还删除了时间部分,您不知道这对于这个特定的业务问题是否有效。税务对象可能特定于另一个字段中存在的特定国家或时区,该字段具有与区域税务规则关联的特定时间,即某物应在哪一天征税。OP的问题是要求之一,而不是将ZonedDateTime转换为LocalDate。Sunil的回答也有同样的警告:仅仅因为您将ChronoZonedDateTime转换为LocalDate,并不意味着它与另一个LocalDate在同一时区是本地的。您还删除了时间部分,您不知道这是否适用于此特定业务