每月最后一天的计算

我有问题的计算时,下一个月的最后一天是通知,这是预定发送。

这是我的代码:

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

这条路线引起了一些问题,我认为:

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

如何使用“日历”正确设置下个月的最后一天进行通知?

226321 次浏览
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);

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

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

如果将 Calendar 对象设置为要查找的最后日期所在的月份,那么 getActualMaximum(Calendar.DAY_OF_MONTH)将给出最后一天。

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

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

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

并获取作为 Date 对象的最后一天:

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


Date lastDayOfMonth = cal.getTime();

以下将始终产生适当的结果:

    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();

时间。时间。时间调整器

使用内置在 Java8中的 java.time库,您可以使用 TemporalAdjuster接口。我们找到了一个可以在 TemporalAdjusters实用工具类中使用的实现: lastDayOfMonth

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

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

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

在这里使用最新的 java.time库是最好的解决方案:

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));

使用 java.util.Calendar实现 Kotlin 日期扩展

fun Date.toEndOfMonth(): Date {
return Calendar.getInstance().apply {
time = this@toEndOfMonth
}.toEndOfMonth().time
}


fun Calendar.toEndOfMonth(): Calendar {
set(Calendar.DAY_OF_MONTH, getActualMaximum(Calendar.DAY_OF_MONTH))
return this
}

可以对每个 Date 对象(如 Date().toEndOfMonth())调用 toEndOfMonth函数

也可以使用 YearMonth。

比如:

YearMonth.of(2019,7).atEndOfMonth()
YearMonth.of(2019,7).atDay(1)

Https://docs.oracle.com/javase/8/docs/api/java/time/yearmonth.html#atendofmonth——