今天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());