坑爹的Period

今天debug代碼時突然發現得到的結果不正確 當時就懵逼了 代碼如下

Period.between(firstDate, secondDate).getDays();

firstDate和secondDate在同一個月沒有問題  結果正確  但是firstDate和secondDate不同月或不同年結果就不知道啥意思了

// 結果12
System.out.println(Period.between(LocalDate.of(2020,10,11),
                LocalDate.of(2021,10,23)).getDays());
// 結果-19
System.out.println(Period.between(LocalDate.of(2020,11,11),
                LocalDate.of(2020,10,23)).getDays());

// 結果12
System.out.println(Period.between(LocalDate.of(2020,11,11),
                LocalDate.of(2020,11,23)).getDays());

針對這個結果我是懵逼的  後面兜兜轉轉換成了如下代碼

// 結果12
System.out.println(LocalDate.of(2020,10,11)
                .until(LocalDate.of(2021,10,23)).getDays());
// 結果-19
System.out.println(LocalDate.of(2020,11,11)
                .until(LocalDate.of(2020,10,23)).getDays());
// 結果12
System.out.println(LocalDate.of(2020,11,11)
                .until(LocalDate.of(2020,11,23)).getDays());

進過測試後內心是崩潰的  後來經過源碼查看 發現它們的邏輯是一樣的

# Period
public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive) {
        return startDateInclusive.until(endDateExclusive);
}


# LocalDate
@Override
public Period until(ChronoLocalDate endDateExclusive) {
        LocalDate end = LocalDate.from(endDateExclusive);
        long totalMonths = end.getProlepticMonth() - this.getProlepticMonth();  // safe
        int days = end.day - this.day;
        if (totalMonths > 0 && days < 0) {
            totalMonths--;
            LocalDate calcDate = this.plusMonths(totalMonths);
            days = (int) (end.toEpochDay() - calcDate.toEpochDay());  // safe
        } else if (totalMonths < 0 && days > 0) {
            totalMonths++;
            days -= end.lengthOfMonth();
        }
        long years = totalMonths / 12;  // safe
        int months = (int) (totalMonths % 12);  // safe
        return Period.of(Math.toIntExact(years), months, days);
}

private long getProlepticMonth() {
        return (year * 12L + month - 1);
}

分開我知道是啥意思  合到一起我就不知道是啥意思了 哎

經過爬山涉水最後終於找到了正確的道路

// 結果377
System.out.println(ChronoUnit.DAYS.between(LocalDate.of(2020,10,11),
                LocalDate.of(2021,10,23)));
// 結果-19
System.out.println(ChronoUnit.DAYS.between(LocalDate.of(2020,11,11),
                LocalDate.of(2020,10,23)));
// 結果12
System.out.println(ChronoUnit.DAYS.between(LocalDate.of(2020,11,11),
                LocalDate.of(2020,11,23)));
// 結果377
System.out.println(LocalDate.of(2021,10,23).toEpochDay() -
                LocalDate.of(2020,10,11).toEpochDay());
// 結果-19
System.out.println(LocalDate.of(2020,10,23).toEpochDay() -
                LocalDate.of(2020,11,11).toEpochDay());
// 結果12
System.out.println(LocalDate.of(2020,11,23).toEpochDay() -
                LocalDate.of(2020,11,11).toEpochDay());

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章