计算月份的最后一天

我计算下一个最后一天的时间是计划发送的通知的问题。

这是我的代码:

RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency(); Calendar nextNotifTime = Calendar.getInstance(); 

这是我相信导致问题的线路:

 nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(), recurrenceFrequency.getRecurrenceOffset()); 

我如何使用日历来正确设置通知的下个月的最后一天?

Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);

这将返回当前月份的实际最大值。 例如现在是闰年的二月,所以它返回29。

并将最后一天作为Date对象:

 Calendar cal = Calendar.getInstance(); cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE)); Date lastDayOfMonth = cal.getTime(); 

java.time

使用内置于Java 8中的java.time库,可以使用TemporalAdjuster类(或TemporalAdjusters实用程序类 )

 import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; LocalDate now = LocalDate.now(); //2015-11-23 LocalDate lastDay = now.with(TemporalAdjusters.lastDayOfMonth()); //2015-11-30 

如果您需要添加时间信息,您可以使用任何可用的LocalDate到LocalDateTime转换

 lastDay.atStartOfDay(); //2015-11-30T00:00 

您可以将日历设置为下个月的第一天,然后减去一天。

 Calendar nextNotifTime = Calendar.getInstance(); nextNotifTime.add(Calendar.MONTH, 1); nextNotifTime.set(Calendar.DATE, 1); nextNotifTime.add(Calendar.DATE, -1); 

运行此代码nextNotifTime将被设置为当前月份的最后一天。 请记住,如果今天是本月的最后一天,则此代码的净效应是Calendar对象保持不变。

以下将始终给出适当的结果:

  Calendar cal = Calendar.getInstance(); cal.set(Calendar.MONTH, ANY_MONTH); cal.set(Calendar.YEAR, ANY_YEAR); cal.set(Calendar.DAY_OF_MONTH, 1);// This is necessary to get proper results cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE)); cal.getTime(); 

查看Calendar对象的getActualMaximum(int field)方法。

如果您将日历对象设置为您要查找最后date的月份,则getActualMaximum(Calendar.DAY_OF_MONTH)会为您提供最后一天。

使用最新的java.time库是最好的解决scheme:

 LocalDate date = LocalDate.now(); LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth()); 

或者,你可以这样做:

 LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth()); 
  SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date date = sdf.parse("11/02/2016"); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); System.out.println("First Day Of Month : " + calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); System.out.println("Last Day of Month : " + calendar.getActualMaximum(Calendar.DAY_OF_MONTH));