获取日期 Java 之间的计数天数

Get count day between to date Java

你好,我需要使用 ChronoUnit

计算日期之间的天数

这是我的代码:

            Date madate = rfxobjet.getRv_rc_date();
            Date date=java.util.Calendar.getInstance().getTime();
            Date res=null;
            int day = ChronoUnit.DAYS.between(madate,date);

但我收到了这个错误: ChronoUnit 类型中的方法 between(Temporal, Temporal) 不适用于参数 (Date, Date)

请问我该怎么办我需要解决这个错误

你混合不同API。 日期是一个旧的 class,自 JDK 1 以来一直在 Java。 虽然 ChronoUnit 来自较新的日期 API 首先出现在 JDK8。 通常你应该使用更新的 API。这意味着您应该使用 LocalDate(或 LocalDateTime),而不是 Date,它是新 API.

的一部分

因此,为了更正您的代码,您需要使 madate 和 date 都是 LocalDate 的实例。 例如。这应该有效:

LocalDate madate = LocalDate.now();
LocalDate date = LocalDate.now();
long day = ChronoUnit.DAYS.between(madate, date);

或者如果您仍然需要使用 Date 对象,您可以将它们转换为 Temporal 对象:

Date madate = rfxobjet.getRv_rc_date();
Date date = java.util.Calendar.getInstance().getTime();
long day = ChronoUnit.DAYS.between(madate.toInstant(), date.toInstant());

Temporal 是 LocalDate 和 LocalDateTime 的基础 class,因此使用 Date.toInstant() 您实际上将日期转换为新的 API.

中的相应实例

注意。 between() returns long 所以 day 变量也需要是 long 类型或者你需要使用到 int 转换:

int day = (int) ChronoUnit.DAYS.between(madate, date);
Date madate = rfxobjet.getRv_rc_date();//please consider renaming this variable
LocalDate madataLocalDate = Instant.ofEpochMilli(madate.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate now = LocalDate.now();
long day = ChronoUnit.DAYS.between(madataLocalDate, now);

基本上你需要使用 java.time 包中的 类,你不能在 java.util.Datejava.time.LocalDate 之间混用。

您应该停止使用过时且容易出错的 java.util 日期时间 API 并切换到 modern date-time API.

如果 rfxobjet.getRv_rc_date() returns 是 java.util.Date 的对象,您的第一步应该是将其转换为此对象上 Instant by calling Date#toInstant 类型的对象,即

Date madate = rfxobjet.getRv_rc_date();
Instant instant = madate.toInstant();

一旦您拥有 Instant 的对象,您可以根据您的要求将其转换为任何其他现代日期时间对象,例如

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.now();
        // I've used the time-zone of Europe/London as an example, you can choose any
        // time-zone as per your requirement. You can also select the time-zone used by
        // your JVM, ZoneId.systemDefault()
        ZonedDateTime zdt = instant.atZone(ZoneId.of("Europe/London"));
        OffsetDateTime odt = zdt.toOffsetDateTime();
        LocalDateTime ldt = zdt.toLocalDateTime();
        System.out.println(instant);
        System.out.println(zdt);
        System.out.println(odt);
        System.out.println(ldt);
    }
}

输出:

2020-06-28T16:58:27.725618Z
2020-06-28T17:58:27.725618+01:00[Europe/London]
2020-06-28T17:58:27.725618+01:00
2020-06-28T17:58:27.725618

注意: LocalDateTime 丢弃 区域偏移量 区域 ID [=57= 等信息] 这在您的业务逻辑中可能是必需的。因此,根据下面显示的 table (Ref) 选择合适的 class:

回到你的问题:

现在您有了 Instant 的对象,您可以获取 LocalDateTime 的实例,如上文所述,即

ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDateTime ldt = zdt.toLocalDateTime();

最后一步是获取从现在到 ldt 之间的天数,您可以按以下步骤操作:

LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());
long days = ChronoUnit.DAYS.between(ldt, now);

请注意,我已按照推荐做法将 ZoneId 作为参数传递给 LocalDateTime.now,以便您可以根据需要指定所需的 ZoneId。如果不传这个参数,默认使用ZoneId.systemDefault()

完整代码:

Date madate = rfxobjet.getRv_rc_date();
Instant instant = madate.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDateTime ldt = zdt.toLocalDateTime();
LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());
long days = ChronoUnit.DAYS.between(ldt, now);