java.time.DateTimeException:无效日期 'February 29',因为“2017”不是闰年 Java
java.time.DateTimeException: Invalid date 'February 29' as '2017' is not a leap year 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
获取所选月份的第一个和最后一个日期,一切正常但是当我 select 二月和 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();
}
我不知道哪里做错了请有人帮助我
发生这种情况是因为您在这一行中使用了 maxLength()
:
LocalDate endDate = date.withDayOfMonth(date.getMonth().maxLength());
方法 maxLength()
returns 本月的最大长度(以天为单位),如 API documentation 所述。 2 月确实有最多 29 天(只是不是 2017 年,但这是一般的 2 月,而不是任何特定年份!)。
这应该可行,因为它考虑了特定年份中月份的长度:
LocalDate endDate = date.withDayOfMonth(date.lengthOfMonth());
方法 maxLength() 不适合确定二月的上下文相关长度(28 或 29 天)。该方法总是产生 29.
您应该考虑 lengthOfMonth() 方法。
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;
}
}
试试上面的代码。
希望对你有帮助。
我试图在 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
获取所选月份的第一个和最后一个日期,一切正常但是当我 select 二月和 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();
}
我不知道哪里做错了请有人帮助我
发生这种情况是因为您在这一行中使用了 maxLength()
:
LocalDate endDate = date.withDayOfMonth(date.getMonth().maxLength());
方法 maxLength()
returns 本月的最大长度(以天为单位),如 API documentation 所述。 2 月确实有最多 29 天(只是不是 2017 年,但这是一般的 2 月,而不是任何特定年份!)。
这应该可行,因为它考虑了特定年份中月份的长度:
LocalDate endDate = date.withDayOfMonth(date.lengthOfMonth());
方法 maxLength() 不适合确定二月的上下文相关长度(28 或 29 天)。该方法总是产生 29.
您应该考虑 lengthOfMonth() 方法。
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;
}
}
试试上面的代码。 希望对你有帮助。