“没有找到合适的方法(日期,日期)和#34;当试图计算两个日期之间的天数差异时

时间:2017-06-10 12:10:40

标签: java date compiler-errors java-time java.util.date

如何计算用户之前从jXDatePicker swing组件中选择的对象的当前日期和日期之间的差异,以及已作为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);

2 个答案:

答案 0 :(得分:6)

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

您可以使用Date类,而不是使用旧版java.time.LocalDate类,然后获取两个日期之间的差异。

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

更新

根据您的评论,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);

更新2

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

Instant now = Instant.now();
long daysDifference = obj.getSelectedDate()
                         .toInstant()
                         .until(now, ChronoUnit.DAYS);

答案 1 :(得分:3)

我同意Pallavi Sonal’s answer,当您可以使用现代java.time课程时,您应该将使用Date之类的老式课程保持在最低限度。我不知道JXDatePicker,但我看到its getDate method返回Date。所以你要做的第一件事就是把它转换成更现代的东西。

从您的问题看来,在这种情况下,您只关心日子,而不是时间。如果这是正确的,Pallavi Sonal也是正确的,LocalDate是适合您的正确课程。我认为这种转换应该对你有用

    LocalDate selectedDate = jXDatePicker.getDate()
            .toInstant()
            .atZone(ZoneId.systemDefault())
            .toLocalDate();

这是对时区问题的一些保留,因为我不知道日期选择器在哪个时区给你日期。一旦你知道,你可以填写正确的时区而不是ZoneId.systemDefault()

不幸的是,我不知道日期选择器组件可以直接为您提供LocalDate。可能有一个,我希望有,所以它可能值得搜索一个。