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