Это логическая ошибка в том, как вы продумали свою программу / алгоритм. Сначала вы находите последний день месяца, в данном случае 30 июня. Затем вычитаете 1 месяц. Это дает 30 мая независимо от того, что в мае 31 день (из документации DateUtils.addMonths
не ясно, что он работает таким образом, но он использует плохо спроектированный и устаревший класс Calendar
внутри, так что это то, что мы должны ожидать).
Вместо этого делайте вещи в обратном порядке. Сначала найдите предыдущий месяц:
YearMonth lastMonth = YearMonth.now(ZoneId.of("Asia/Kolkata")).minusMonths(1);
2019-05
Поскольку новый месяц не начинается в один и тот же момент времени во всех часовых поясах, я рекомендую указать желаемый часовой пояс, как показано на рисунке.
Только тогда найдите последний день месяца:
LocalDate lastDayOfLastMonth = lastMonth.atEndOfMonth();
2019-05-31
Избегайте даты и календаря
Я рекомендую не использовать Date
и Calendar
. Эти классы плохо разработаны и давно устарели. Вместо этого используйте LocalDate
и другие классы из java.time, современного Java-API даты и времени. Это также избавит вас от внешней зависимости от Apache DateUtils
, поскольку его функциональные возможности обычно встроены в современные классы.
Ссылки