2012-02-22 127 views
99

我在计算下个月的下个最后一天是计划发送的通知的计算方面存在问题。月份计算的最后一天

这里是我的代码:

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

这是该行造成的问题,我相信:

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

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

+1

将其设置为下个月的第一天,然后回滚一天。 – Bill 2012-02-22 15:03:06

+0

[SSCCE](http://sscce.org)可以让回答这个问题更容易。你真的看到了什么问题? – DNA 2012-02-22 15:04:11

回答

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

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

+0

谢谢,但是我需要获得下个月的最大值,但它仍然需要工作,因为它现在可以成为本月的第一天。 再次感谢您的时间和精力 – OakvilleWork 2012-02-22 15:33:40

+3

每个日期都得到'ActualMaximum'并不是问题。在调用'getActualMaximum'之前,将日历实例滚动到所需日期。第一个日期可以通过'getActualMinimum()' – AlexR 2012-02-22 16:14:34

+0

确定,非常感谢Alex,所以如果我想将实例推到一个月前,并找出那个月的getActualMaximum,我会怎么做呢? 干杯 – OakvilleWork 2012-02-22 19:26:16

1

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

如果您将日历对象设置为您正在寻求最后日期的月份,那么getActualMaximum(Calendar.DAY_OF_MONTH)会为您提供最后一天。

20

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

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

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

+0

不错的想法,简单的逻辑... – 2018-01-28 06:43:21

25

而得到最后一天为Date对象:

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

Date lastDayOfMonth = cal.getTime(); 
10

继总会给正确的结果:

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

为什么这是必要的?你能告诉我:) – 2015-03-28 13:02:00

+1

是的,刚刚测试失败,因为上面的确切原因。问题是,除非设置了DAY_OF_MONTH,否则它将默认为当前。 – ppearcy 2015-03-30 17:21:16

21

java.time

使用java.time库内置到Java 8,您可以使用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 
1

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

LocalDate date = LocalDate.now(); 
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth()); 

另外,您可以这样做:

LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth()); 
0
 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));