获取月份的最后一天

为了获得月份的最后日期,我已经写了这个函数

/** * @param month integer value of month * @param year integer value of month * @return last day of month in MM/dd/YYYY format */ private static String getDate(int month, int year) { Calendar calendar = Calendar.getInstance(); // passing month-1 because 0-->jan, 1-->feb... 11-->dec calendar.set(year, month - 1, 1); calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE)); Date date = calendar.getTime(); DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/YYYY"); return DATE_FORMAT.format(date); } 

对于所有输入它的工作正常,当月份是12月时,有一个例外,即getDate(12,2012)返回12/31/2013,但它应该返回12/31/2012。 请解释一下行为和解决方案。

YYYY改为yyyy

 DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy"); 

YYYY是错误的dateformat

试试这个

 calendar.add(Calendar.MONTH, month); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.DATE, -1); Date date = calendar.getTime(); 

尝试使用Joda-Time ,它更简单:

 private static String getLastDayOfMonth(int month, int year) { LocalDate lastDayOfMonth = new LocalDate(year, month, 1).dayOfMonth().withMaximumValue(); return lastDayOfMonth.toString("MM/dd/yyyy"); } 

 private static String getDate(int month, int year) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MONTH, month); calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE)); Date date = calendar.getTime(); DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy"); return DATE_FORMAT.format(date); } 

TL;博士

 YearMonth.of( 2016 , 6 ) .atEndOfMonth() .toString() 

2016年6月30日

java.time

使用Java 8及更高版本中内置的java.time类非常容易。 后端移植到Java 6和7 ,并进一步适应Android 。

YearMonth

使用方便的YearMonth类。

提示:在代码库周围传递此类的对象,而不仅仅是整数,以便从类型安全性,保证有效值和更多自我记录代码中受益。

 YearMonth yearMonth = YearMonth.of( 2016 , 6 ); 

…要么…

 YearMonth yearMonth = YearMonth.of( 2016 , Month.JUNE ); 

LocalDate

然后询问当月的最后一天,由LocalDate代表。

 LocalDate endOfMonth = yearMonth.atEndOfMonth(); 

2016年6月30日

字符串

您在上面看到toString的结果,其中使用标准ISO 8601格式生成String。 您可以使用其他格式。

DateTimeFormatter类可以自动转换为人类语言,并将文化规范应用于诸如句号与逗号或年 – 月日部分的排序等问题。

 DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ); formatter = formatter.withLocale( Locale.US ); // Re-assign JVM's current default Locale that was implicitly applied to the formatter. String output = localDate.format( formatter ); 

Locale.US为我们提供了月/日/年格式。 您还可以通过调用DateTimeFormatter.ofPattern来指定显式模式。

 With Java 8 DateTime / LocalDateTime : private static String getDate(int month, int year) { Month monthObj = Month.of(month); LocalDate date = LocalDate.of(year, month, monthObj.maxLength()); return date.format(DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.US)); } 

您可以使用以下代码获取该月的最后一天

 public static String getLastDayOfTheMonth(String date) { String lastDayOfTheMonth = ""; SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); try{ java.util.Date dt= formatter.parse(date); Calendar calendar = Calendar.getInstance(); calendar.setTime(dt); calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.DATE, -1); java.util.Date lastDay = calendar.getTime(); lastDayOfTheMonth = formatter.format(lastDay); } catch (ParseException e) { e.printStackTrace(); } return lastDayOfTheMonth; } 

试试这个

 private static String getDate(int month, int year) { Calendar dateCal = Calendar.getInstance(); dateCal.set(year, month, 2); int maxDay = dateCal.getActualMaximum(Calendar.DAY_OF_MONTH); String pattern = "MMMM"; SimpleDateFormat obDateFormat = new SimpleDateFormat(pattern); String monthName = obDateFormat.format(dateCal.getTime()); return "Last date of " + monthName + " " + year + " : " + maxDay; } 

你在考虑闰年吗? 如果没有,那么你可以尝试下面的代码:

 public static Date calculateMonthEndDate(int month, int year) { int[] daysInAMonth = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int day = daysInAMonth[month]; boolean isLeapYear = new GregorianCalendar().isLeapYear(year); if (isLeapYear && month == 2) { day++; } GregorianCalendar gc = new GregorianCalendar(year, month - 1, day); Date monthEndDate = new Date(gc.getTime().getTime()); return monthEndDate; }