Java 每月最后一天计算

Java 每月最后一天计算,java,datetime,calendar,Java,Datetime,Calendar,我在计算下一个月的最后一天何时发送通知时遇到问题 这是我的密码: RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency(); Calendar nextNotifTime = Calendar.getInstance(); 我认为这是导致问题的原因: nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(),

我在计算下一个月的最后一天何时发送通知时遇到问题

这是我的密码:

RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
我认为这是导致问题的原因:

nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(), 
                  recurrenceFrequency.getRecurrenceOffset());
如何使用日历正确设置通知的下个月最后一天

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

这将返回当月的实际最大值。例如,现在是闰年的二月,因此它返回29作为
int

查看Calendar对象的
getActualMaximum(int字段)
方法


如果您将日历对象设置为查找最后日期的月份,则
getActualMaximum(Calendar.DAY\u OF\u month)
将为您提供最后一天。

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

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

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

要将最后一天作为日期对象,请执行以下操作:

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();
java.time.temporal.TemporalAdjusters.lastDayOfMonth() 使用内置于Java8中的
java.time
库,您可以使用该接口。我们发现一个实现可在实用程序类中使用:

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

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

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

LocalDate date = LocalDate.now();
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
或者,您可以执行以下操作:

LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth());

使用
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
}

您可以对每个日期对象调用
toEndOfMonth
函数,如
Date()。toEndOfMonth()也可以使用YearMonth

比如:

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

将其设置为下个月的第一天,然后回滚一天。A将使回答此问题更容易。你到底看到了什么问题?谢谢,我需要得到下个月的最大值,但是,它仍然需要工作,可以是一个月的第一天,以及该部分的工作现在。再次感谢您花时间和精力为每个日期获得
实际最大值
,这不是问题。只需将日历实例滚动到所需日期,然后调用
getActualMaximum
。第一个日期可以通过
getActualMinimum()
ok获得,非常感谢Alex,因此如果我希望将实例滚动到一个月前,并找出该月的getActualMaximum,我将如何操作??干杯,是亚历克斯吗?nextNotifTime.roll(Calendar.MONTH,true);nextNotifTime.getActualMaximum(日历、月日);此外,我还设置了以下准备日期时间:
nextNotification.setReadyDateTime(nextNotifTime.getTime())nextNotifTime.roll(Calendar.MONTH,true);nextNotifTime.getActualMaximum(日历、月日);nextNotifTime.setTime(日历、月日)?为什么有必要?你能告诉我:)是的,只是因为上面这个确切的原因测试失败了。问题是,除非设置了月的日,否则它将默认为当前。您应该首先设置(月的日,1)。如果您在1月31日,并将月份设置为2月,则会跳到3月,因为2月31日不存在<代码>日历cal=DateUtils.getCalendar(2021,1,31);//DateUtils是定制的。校准设置(日历.月份,日历.二月);System.out.println(cal.getTime())>>>周三3月3日00:00:00 CET 2021@mikeThese可怕的类在几年前被采用JSR 310的现代java.time类所取代。在2019年建议这些遗留类是一个糟糕的建议。这不是一个坏建议。现代java.time仅适用于API 26+的Android。我们仍然依赖java.util.*来支持(并非如此)旧设备。回答得好。但最后一部分很弱,建议使用
LocalDateTime
。该类没有任何时区或UTC偏移的概念。所以它无法确定某个地方的某一天何时开始。该类只适用于普通的24小时工作日,而不适用于现实世界中的工作日。对于实际日期,请指定时区:
ZonedDateTime zdt=now.atStartOfDay(ZoneId.of(“亚洲/东京”)。在某些地方,由于夏时制(DST)等异常情况,有些日子可能会在不同的时间开始,例如01:00。这就是答案!
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
}
YearMonth.of(2019,7).atEndOfMonth()
YearMonth.of(2019,7).atDay(1)