Использование parseWeekBasedPeriod(...)
, безусловно, неправильно, если вы хотите применять длительности, измеренные в месяцах. Этот особый метод работает с недельными годами, которые могут длиться 364 или 371 день (52 или 53 недели). Поэтому я предлагаю просто использовать стандартный метод синтаксического анализа для календарных длительностей. Следующий код также сильно упрощает оценку дней между двумя датами (см. Последнюю строку).
Duration<CalendarUnit> duration = Duration.parseCalendarPeriod("P3M");
PlainDate today = PlainDate.nowInSystemTime();
PlainDate later = today.plus(duration);
long days = CalendarUnit.DAYS.between(today, later);
Кстати, я еще раз проверил метод на основе продолжительности недели. Обычно он генерирует исключение, если пытается проанализировать месяцы. Похоже, вы не видели никаких исключений, поэтому я предполагаю, что тот факт, что вы используете нетипизированные конструкции, такие как «val», затеняет необходимую информацию о типе при обработке строки продолжительности (а Time4J - библиотека со строгим типом). Поэтому - если это технически возможно для вас - я настоятельно рекомендую использовать код, безопасный для типов, как показано в моем решении.