java .util.Calendar getMaximum возвращает неверный последний день - PullRequest
0 голосов
/ 21 января 2020

Я должен исправить код. И по какой-то причине Calender.getMaximum(Calendar.DAY_OF_MONTH) вернулся за июнь 2019 года 31 день вместо 30 дней, потому что в июне только 30 дней.

public static int getWorkingDaysInMonth(int month, int year) {
    Calendar monthStart = Calendar.getInstance();
    Calendar monthEnd = Calendar.getInstance();
    monthStart.set(year, month, 1);
    return monthStart.getActualMaximum(Calendar.DAY_OF_MONTH);
}

Теперь, как вы видите, я заменил getMaximum() на getActualMaximum(). Теперь я получаю за последний день = 30, так что теперь это правильно. Но всегда ли вернется правильный последний день, я не хочу ничего ломать.

И я вызвал функцию следующим образом:

getWorkingDaysInMonth(5, 2019);  // 5 is June

Спасибо за ваш отзыв.

Ответы [ 2 ]

4 голосов
/ 21 января 2020

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, как в реальной жизни; -)

3 голосов
/ 21 января 2020

Из документации :

month - значение, используемое для установки поля календаря MONTH. Значение месяца основано на 0. Например, для января 0 выбран, а не июнь.

И здесь я предлагаю использовать API java.time, представленный в Java 8 (который был выпущен в мае 2014 ). Так как он намного приятнее и проще в использовании, чем «старая» дата api

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...