计算的最后一天

Oak*_*ork 133 java datetime calendar

我在计算当月的下一个最后一天是否为计划发送的通知时遇到问题.

这是我的代码:

RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
Run Code Online (Sandbox Code Playgroud)

这是引起我相信问题的界限:

nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(), 
                  recurrenceFrequency.getRecurrenceOffset());
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*exR 325

Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
Run Code Online (Sandbox Code Playgroud)

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

  • 为每个日期获取"ActualMaximum"不是问题.只需在调用`getActualMaximum`之前将日历实例滚动到所需的日期.第一个日期可以通过`getActualMinimum()`获得 (4认同)

Prz*_*mek 48

java.time

使用java.timeJava 8中内置的库,您可以使用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
Run Code Online (Sandbox Code Playgroud)

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

lastDay.atStartOfDay(); //2015-11-30T00:00
Run Code Online (Sandbox Code Playgroud)


yet*_*rSE 33

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

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

Date lastDayOfMonth = cal.getTime();
Run Code Online (Sandbox Code Playgroud)


Mik*_*eck 21

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

Calendar nextNotifTime = Calendar.getInstance();
nextNotifTime.add(Calendar.MONTH, 1);
nextNotifTime.set(Calendar.DATE, 1);
nextNotifTime.add(Calendar.DATE, -1);
Run Code Online (Sandbox Code Playgroud)

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


Saf*_*ala 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();
Run Code Online (Sandbox Code Playgroud)

  • 是的,刚刚由于上述原因而导致测试失败。问题是,除非设置了 DAY_OF_MONTH,否则它将默认为当前。 (2认同)

sat*_*nam 7

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

LocalDate date = LocalDate.now();
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
Run Code Online (Sandbox Code Playgroud)

或者,您可以执行以下操作:

LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth());
Run Code Online (Sandbox Code Playgroud)


小智 7

您也可以使用 YearMonth。

喜欢:

YearMonth.of(2019,7).atEndOfMonth()
YearMonth.of(2019,7).atDay(1)
Run Code Online (Sandbox Code Playgroud)

https://docs.oracle.com/javase/8/docs/api/java/time/YearMonth.html#atEndOfMonth--