2012-02-22 126 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));