我在计算本月的下一个最后一天是否有计划发送的通知时遇到问题。
这是我的代码:
RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
这是引起我相信的问题的一线:
nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(),
recurrenceFrequency.getRecurrenceOffset());
如何使用日历正确设置通知的下个月的最后一天?
答案 0 :(得分:303)
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
这将返回当月的实际最大值。例如,它现在是闰年的2月,所以它返回29为int
。
答案 1 :(得分:40)
使用Java 8中内置的java.time
库,您可以使用TemporalAdjuster
类(或TemporalAdjusters
utility class)
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
答案 2 :(得分:30)
并将最后一天作为Date对象:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
Date lastDayOfMonth = cal.getTime();
答案 3 :(得分:20)
您可以将日历设置为下个月的第一天,然后减去一天。
Calendar nextNotifTime = Calendar.getInstance();
nextNotifTime.add(Calendar.MONTH, 1);
nextNotifTime.set(Calendar.DATE, 1);
nextNotifTime.add(Calendar.DATE, -1);
运行此代码后,nextNotifTime将设置为当前月份的最后一天。请记住,如果今天是该月的最后一天,此代码的净效果是Calendar对象保持不变。
答案 4 :(得分:15)
以下将始终给出正确的结果:
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();
答案 5 :(得分:5)
在这里使用最新的java.time
库是最佳解决方案:
LocalDate date = LocalDate.now();
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
或者,您可以这样做:
LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth());
答案 6 :(得分:2)
查看Calendar对象的getActualMaximum(int field)
方法。
如果您将日历对象设置为您要查找最后日期的月份,那么getActualMaximum(Calendar.DAY_OF_MONTH)
将为您提供最后一天。
答案 7 :(得分:2)
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));
答案 8 :(得分:1)
您还可以使用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--
答案 9 :(得分:0)
使用java.util.Calendar
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对象上调用toEndOfMonth
函数,例如Date().toEndOfMonth()