Причина, по которой ваш код Joda Time не работает, заключается в том, что если вы не предоставите объект PeriodType
, тогда используется стандартный PeriodType.Стандартный период определяет не только годы, месяцы и дни, которые будут включены в расчет периода, но также и недели.И вы не отображаете количество недель, которое составляет 4 в вашем случае.Если вы напишите period.getWeeks()
, он вернет 4
.
Чтобы заставить его работать, вы должны предоставить PeriodType
в качестве третьего аргумента конструктору Period
.Если вы измените объявление period
на
Period period = new Period(startDate, endDate, PeriodType.yearMonthDay());
, оно будет работать.Тогда для расчета периода будут использоваться только поля года, месяца и дня.
Но
... лучше перейти на новый API даты и времени Java, доступный в java.time
пакет, если вы используете Java 8 или выше.Не поймите меня неправильно, Joda Time - очень хороший API для дат и времени.API даты и времени Java 8 сильно зависит от Joda Time из-за его качества.Его ведущий разработчик на самом деле тот же человек, Стивен Коулборн .
Но Joda Time сейчас находится в режиме обслуживания, и на его веб-сайте пользователям предлагается перейти на java.time (JSR-310).) - основная часть JDK, которая заменяет этот проект.
Использование Java 8 Date and Time API
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/yyyy").withLocale(Locale.US);
// expected output 23...2....29
LocalDate startDate = LocalDate.parse("01/09/1995", f);
LocalDate endDate = LocalDate.parse("30/11/2018", f);
Period period = Period.between(startDate, endDate);
Backport на Java 6 и 7;Поддержка Android
Большая часть функциональности java.time
перенесена на Java 6 и Java 7 в проекте ThreeTen-Backport , также возглавляемом Стивеном Коулборном.Далее адаптирован для более ранних уровней Android API (ниже 26 ) в проекте ThreeTenABP .См. Как использовать ThreeTenABP .
Обратите внимание, что есть некоторые различия между Joda Time и Java Date and Time API.В частности, класс Period
из Java Date and Time API менее полон.Однако класс Period
из Java Date and Time API обеспечивает функциональность, соответствующую вашим требованиям.
Я вижу, что этот код, использующий java.time
, фактически совпадает с кодом @ MaxXFrenzY,Это не из-за копирования-вставки, а из-за того, что новый Java Date and Time API разработан как однозначный и простой.