获取日期 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.Date
和 java.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);
你好,我需要使用 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.Date
和 java.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);