计算的最后一天

时间:2012-02-22 14:58:23

标签: java datetime netbeans calendar

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

这是我的代码:

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

这是引起我相信的问题的一线:

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

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

10 个答案:

答案 0 :(得分:303)

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

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

答案 1 :(得分:40)

java.time

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

实现的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对象上调用toEndOfMonth函数,例如Date().toEndOfMonth()