LocalDate minus period Get the wrong result

LocalDate minus a Period (for example, "28 years, 1 month and 27 days"), you will get the wrong result.

But minus a Period (it has only a daily unit, for example, "10282" days) to get the correct result. Is there anything to notice?

 public static void main(String[] args) { printAgeAndBirthday(1989, 2, 22); printBirthdayFromPeriod(28, 1, 27); } private static void printBirthdayFromPeriod(int years, int months, int days) { final Period period = Period.of(years, months, days); final LocalDate now = LocalDate.now(); final LocalDate birthday = now.minus(28, ChronoUnit.YEARS) .minus(1, ChronoUnit.MONTHS) .minus(27, ChronoUnit.DAYS); System.out.println("your birthday is : "+ birthday);//1989-02-19 System.out.println("your birthday is : "+ now.minusYears(28).minusMonths(1).minusDays(27));//1989-02-19 System.out.println("your birthday is : "+ now.minus(period));//1989-02-19 System.out.println("your birthday is : "+period.subtractFrom(now));//1989-02-19 System.out.println("your birthday is : "+ now.minus(Period.ofDays(10282)));//1989-02-22 } private static void printAgeAndBirthday(int year, int month, int dayOfMonth) { LocalDate today = LocalDate.now(); LocalDate birthday = LocalDate.of(year, month, dayOfMonth); Period p = Period.between(birthday, today); long p2 = ChronoUnit.DAYS.between(birthday, today); System.out.printf("You are %d years, %d months, and %d days old. (%d days total)%n", p.getYears(), p.getMonths(), p.getDays(), p2); LocalDate nextBDay = birthday.withYear(today.getYear()); //If your birthday has occurred this year already, add 1 to the year. if (nextBDay.isBefore(today) || nextBDay.isEqual(today)) { nextBDay = nextBDay.plusYears(1); } Period p_1 = Period.between(today, nextBDay); long p_2 = ChronoUnit.DAYS.between(today, nextBDay); System.out.printf("There are %d months, and %d days until your next birthday. (%d total)%n", p_1.getMonths(), p_1.getDays(), p_2); } 

console log:

 You are 28 years, 1 months, and 27 days old. (10282 days total) There are 10 months, and 4 days until your next birthday. (310 total) your birthday is : 1989-02-19 your birthday is : 1989-02-19 your birthday is : 1989-02-19 your birthday is : 1989-02-19 your birthday is : 1989-02-22 

java version: jdk1.8.0_45

+5
source share
1 answer

Your case can be simplified to

 LocalDate date1 = LocalDate.of(2017, 2, 22), date2 = LocalDate.of(2017, 4, 18); Period p = Period.between(date1, date2); System.out.println("date1 + p: "+date1.plus(p)); System.out.println("date2 - p: "+date2.minus(p)); 

which will print

 date1 + p: 2017-04-18 date2 - p: 2017-02-19 

In other words, the number of years does not matter (unless one of the participating years is a leap year and the other does not, but both arent here). The following is a description of the problem:

 February March April 19 20 21 22 23 24 25 26 27 28 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ↑ │ ↑ ↑ │ └──────────────────────────── plus one Month ───────────────────────────────────────┴───────────────────────── plus 27 days ─────────────────────────────────────────┤ │ ↑ ↓ └───────────────────────── minus 27 days ────────────────────────────────────────┴─────────────────── minus one month ────────────────────────────────────────────────────────┘ 

This will change if you change direction:

 Period p2 = Period.between(date2, date1); System.out.println("date1 - p2: "+date1.minus(p2)); System.out.println("date2 + p2: "+date2.plus(p2)); 

which will print

 date1 - p2: 2017-04-15 date2 + p2: 2017-02-22 

Therefore, when you express a period in terms of years, months, and days, the direction becomes relevant. In contrast, an equal number of days between two dates is invariant:

 LocalDate date1 = LocalDate.of(2017, 2, 22), date2 = LocalDate.of(2017, 4, 18); Period p = Period.ofDays((int)ChronoUnit.DAYS.between(date1, date2)); System.out.println("date1 + p: "+date1.plus(p)); System.out.println("date2 - p: "+date2.minus(p)); 
 date1 + p: 2017-04-18 date2 - p: 2017-02-22 
+12
source

Source: https://habr.com/ru/post/1266848/


All Articles