2017-05-04 149 views
1

我尝试获取Java中的开始日期和结束日期,我有JCombobox年和1月份的月份列表JCombobox到Dispay年。java.time.DateTimeException:无效日期'2月29日'为'2017'不是闰年Java

首先我必须转换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所选月份的最后日期,每一件事情是工作正常,但是当我选择了2月月至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(); 
    } 

我不知道我做错了,请有人帮我

+0

我知道,但如何引发异常,您可以解释 –

+0

顺便说一下,在将来,请包括异常的完整堆栈跟踪 - 和/或添加一个注释到您的代码解释哪一行异常发生了。 – yshavit

+0

好吧,我得到了我的答案 –

回答

9

这是因为你在这一行使用maxLength()

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

maxLength()返回天这个月的最大长度的方法,正如API documentation所说。二月份的确最多有29天(不是在2017年,但这大概是二月份的总体月份,而不是在任何特定的一年!)。

这应该工作,因为它需要一个月的长度在特定年份考虑:

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

帮助Jesper +1谢谢很多人 –

3

方法maxLength()不适合确定日的上下文相关的长度(无论是28或29天)。该方法始终产生29.

您应该考虑方法lengthOfMonth()

+0

帮助Meno Hochschild +1非常感谢 –

1
 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; 
     } 
    } 

试试上面的代码。 希望这会帮助你。

相关问题