"尝试计算两个日期之间的天数差异时,找不到(日期,日期)之间的合适方法

-2 java compiler-errors date java.util.date java-time

如何计算用户之前从jXDatePickerswing组件中选择的对象的当前日期和日期之间的差异以及已添加Date到该对象的对象.

在我最后一行的当前代码中,我收到此错误消息:

找不到合适的方法(日期,日期)

Date currentDate = new Date();          
Date objDate = obj.getSelectedDate(); //getting date the user had 
                                      //previously selected and that been 
                                      //added to object      
long daysDifference = ChronoUnit.DAYS.between(objDate, currentDate);
Run Code Online (Sandbox Code Playgroud)

Pal*_*nal 6

您正在将旧的日期时间代码与新的Java 8 Date-Time API混合在一起.该ChronoUnit.between(Temporal, Temporal)方法来自java.time.temporal包含两个Temporal对象的包.它不支持java.util.Date作为参数,因此编译错误.

Date您可以使用java.time.LocalDateclass,而不是使用遗留类,然后获取两个日期之间的差异.

LocalDate currentDate = LocalDate.now(ZoneId.systemDefault());
LocalDate objDate = obj.getSelectedDate();  // object should also store date as LocalDate
long daysDifference = ChronoUnit.DAYS.between(objDate, currentDate);
Run Code Online (Sandbox Code Playgroud)

更新

根据您的注释,objDate只能是Date,因此在这种情况下,您可以使用Legacy Date-Time和Java 8 Date-Time类之间的互操作性.

LocalDateTime currentDate =  LocalDateTime.now(ZoneId.systemDefault());
Instant objIns = obj.getSelectedDate().toInstant();
LocalDateTime objDtTm = LocalDateTime.ofInstant(objIns, ZoneId.systemDefault());
long daysDifference = ChronoUnit.DAYS.between(objDtTm, currentDate);
Run Code Online (Sandbox Code Playgroud)

更新2

正如Ole VV在评论中所指出的,为了处理可能出现的时区问题,使用计算差异Instant是一种更好的方法.

Instant now = Instant.now();
long daysDifference = obj.getSelectedDate()
                         .toInstant()
                         .until(now, ChronoUnit.DAYS);
Run Code Online (Sandbox Code Playgroud)

  • 感谢更新.有一个理论上的坏角落案例:如果有人在两次调用"ZoneId.systemDefault()"之间更改了时区设置,则可能会得到错误的结果.即使是在同一JVM中运行的完全不同的程序,也可能发生这种情况.最好将两个`Instant`对象传递给`between()`. (2认同)