Calendar.getMaximum()
возвращает максимальную сумму, которую переданное поле имеет , в вашем случае Calendar.DAY_OF_MONTH
и 31, потому что ни в одном месяце не будет 32 или более дней
⇒ максимальное количество дней в месяце, которое может быть в году
⇒ всегда будет 31, независимо от того, какой месяц определен
Calendar.getActualMaximum()
возвращает максимальное количество дней, указанное месяц (определенный в этом самом экземпляре) фактически имеет
⇒ количество дней, которое месяц этого экземпляра имеет в году экземпляра
⇒ выведет разные значения для разных месяцев в разные годы
Это должно означать, что Calendar.getActualMaximum()
должно работать для каждого месяца в каждом году.
Я бы использовал java.time
для этого, см. Следующие примеры:
длинная версия с расчетом:
public static long getWorkingDaysInMonth(int month, int year) {
// create a LocalDate that represents the 1st of the given month in the given year
LocalDate firstOfMonth = LocalDate.of(year, month, 1);
// and create one that represents the 1st of the following month
LocalDate firstOfNextMonth = firstOfMonth.plusMonths(1);
// return the amount of days between (the second argument is exclusive)
return ChronoUnit.DAYS.between(firstOfMonth, firstOfNextMonth);
}
короткие версии:
public static long getWorkingDaysInMonth(int month, int year) {
// directly return the amount of days of the specified month
return YearMonth.of(year, month).lengthOfMonth();
}
или
public static long getWorkingDaysInMonth(int month, int year) {
// directly return the amount of days of the specified month
return LocalDate.of(year, month, 1).lengthOfMonth();
}
Примечание:
Независимо от того, какую версию вы нужно позвонить по номеру
int amountOfDays = getWorkingDaysInMonth(6, 2019);
, потому что в java.time
месяцы начинаются с 1, как в реальной жизни; -)