计算月份的最后一天
我计算下一个最后一天的时间是计划发送的通知的问题。
这是我的代码:
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));