java.time.DateTimeException: недопустимая дата «29 февраля», поскольку «2017» не является високосным годом Java

Я пытаюсь получить дату начала и окончания в Java, у меня есть список месяцев с января по декабрь в JCombobox и год JCombobox для отображения лет.

Сначала я преобразовал String месяц в номер месяца и использовал этот код:

if(month_sands.getSelectedIndex() != -1){
        int monthnumber = month_sands.getSelectedIndex() + 1;

         if(monthnumber>=9)
         {
             month=String.valueOf(monthnumber);

         }else
         {
             month="0"+String.valueOf(monthnumber);
         }

    }

Затем позже я создал строку dateString, чтобы получить первую и последнюю дату выбранного месяца, используя LocalDate, все работает нормально, но когда я выбираю февральский месяц и 2017 год, это дает мне исключение java.time.DateTimeException: Invalid date 'February 29' as '2017' is not a leap year

Код для получения первой и последней даты

try {
        String dateString = year_sands.getSelectedItem().toString()+"-"+month+"-"+"01";   
        DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.US); 
        LocalDate date = LocalDate.parse(dateString, dateFormat);
        LocalDate startDate=date.withDayOfMonth(1);
        LocalDate endDate = date.withDayOfMonth(date.getMonth().maxLength());

        start_date=startDate.toString();
        end_date=endDate.toString();

        System.out.println(start_date);
        System.out.println(end_date);
    } catch (Exception e) {
        e.printStackTrace();
    }

Я не знаю, что я делаю неправильно, пожалуйста, помогите мне кто-нибудь


person Intact Abode    schedule 04.05.2017    source источник
comment
я знаю это, но как возникает исключение, можете ли вы объяснить   -  person Intact Abode    schedule 04.05.2017
comment
Кстати, в будущем, пожалуйста, включите полную трассировку стека исключения и/или добавьте в свой код комментарий, объясняющий, в какой строке произошло исключение.   -  person yshavit    schedule 04.05.2017
comment
Хорошо, и я получил свой ответ   -  person Intact Abode    schedule 04.05.2017


Ответы (3)


Это происходит потому, что вы используете maxLength() в этой строке:

LocalDate endDate = date.withDayOfMonth(date.getMonth().maxLength());

Метод maxLength() возвращает максимальную продолжительность этого месяца в днях, поскольку документация по API. Месяц февраль действительно имеет максимум 29 дней (только не в 2017 году, но речь идет о месяце феврале вообще, а не о каком-то конкретном году!).

Это должно работать, потому что учитывает продолжительность месяца в конкретном году:

LocalDate endDate = date.withDayOfMonth(date.lengthOfMonth());
person Jesper    schedule 04.05.2017
comment
Пожалуйста, ответьте: stackoverflow.com/questions/52129200/ - person ankit; 05.09.2018

Метод maxLength() не подходит для определения контекстно-зависимой продолжительности февраля (либо 28, либо 29 дней). Этот метод всегда дает 29.

Вам следует рассмотреть метод lengthOfMonth() вместо этого.

person Meno Hochschild    schedule 04.05.2017
comment
Это помогло Мено Хохшильду +1 Большое спасибо - person Intact Abode; 04.05.2017
comment
Пожалуйста, ответьте: stackoverflow.com/questions/52129200/ - person ankit; 05.09.2018

        String dateString = year_sands.getSelectedItem().toString()+"-"+month+"-"+"01"; 

        DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.US);
        LocalDate date = LocalDate.parse(dateString, dateFormat);
        LocalDate startDate = date.withDayOfMonth(1);
        LocalDate endDate = null;
        if (Integer.parseInt(month) == 02) {
            if (isLeapYear(Integer.parseInt(year_sands.getSelectedItem().toString()))) {
                endDate = LocalDate.parse(year_sands.getSelectedItem().toString() + "-02" + "-29", dateFormat);
            }
            else
            {
                endDate = LocalDate.parse(year_sands.getSelectedItem().toString() + "-02" + "-28", dateFormat);
            }
        } else {
             endDate= date.withDayOfMonth(date.getMonth().maxLength());

        }


public static boolean isLeapYear(int year) {
        if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
            return true;
        } else {
            return false;
        }
    }

Попробуйте приведенный выше код. Надеюсь, это поможет вам.

person Sagar Gangwal    schedule 04.05.2017