java.time.DateTimeException:无效的日期'2月29',因为'2017'不是闰年Java

时间:2017-05-04 07:02:44

标签: java date jcombobox localdate

我尝试在Java中开始和结束日期,我在1月到12月的月份列表中JCombobox和年JCombobox到Dispay Years。

首先我已将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();
    }

我不知道出了什么问题,请有人帮助我

2 个答案:

答案 0 :(得分:12)

这是因为您在此行中使用maxLength()

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

方法maxLength()以天为单位返回本月的最大长度,API documentation表示。 2月确实最多有29天(不是2017年,但这大概是2月一般,而不是在任何特定年份!)。

这应该有效,因为它考虑了特定年份中月份的长度:

LocalDate endDate = date.withDayOfMonth(date.lengthOfMonth());

答案 1 :(得分:3)

方法maxLength()不适合确定2月(28天或29天)的上下文相关长度。该方法总是产生29。

您应该考虑使用方法lengthOfMonth()