2013-03-26 53 views
3

我讀過周圍,基本上我已經想通了,Calendar對象能夠1個月增加使用類似指定的日期:的Java:自定義1個月添加到當前日期

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1); 

雖然我不喜歡它的行爲,只要日期在30或31上。如果我添加了1個月到01/31/2012,則輸出將變成02/29/2012。當我再增加1個月時,它將變成2012年3月29日。

是否有反正我可以強制2012年2月29日自動成爲03/01/2012?

基本上這就是我希望發生的:

默認日期:01/31/2012

添加1個月:03/01/2012

添加1更多個月:3月31日/ 2012

+1

看起來像你想要的實際上是增加30天? – radai 2013-03-26 04:04:26

+0

我想你想添加30/31天,而不是一個月。但是你必須考慮到,所有的月份都沒有相同的數字日期,而且Calendar精美地照顧到了這一點。 – SudoRahul 2013-03-26 04:05:19

+0

我真的不想再添加固定的天數,因爲如您所說,每個月的天數都不相同。也許我應該寫我自己的班級? – mpmp 2013-03-26 04:11:29

回答

3

你所要求的是一些隱含的知識,如果開始日期是月份的最後一天,並且你增加1個月,結果應該是下個月的最後一天。即「最後一個月的」財產應該是粘性的。

這不是Java的Calendar中直接可用的,但是一種可能的解決方案是使用Calendar.getActualMaximum(Calendar.DAY_OF_MONTH)來重置增加月份的那一天。

Calendar cal = ...; 
cal.add(Calendar.MONTH,1); 
cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DAY_OF_MONTH)); 

你甚至可以繼承GregorianCalendar並添加一個方法

public Calendar endOfNextMonth() { ... } 

封裝操作。

0

如果下個月的日期小於其之前的月份的日期,您似乎希望日曆捲起到下個月的開始。下面是我們如何要做到這一點:

Calendar cal = Calendar.getInstance(); 
int oldDay = cal.get(DAY_OF_MONTH); 
cal.add(Calendar.MONTH, 1); 

// If the old DAY_OF_MONTH was larger than our new one, then 
// roll over to the beginning of the next month. 
if(oldDay > cal.get(DAY_OF_MONTH){ 
    cal.add(Calendar.MONTH, 1); 
    cal.set(Calendar.DAY, 1); 
} 
2

好了加30天,你可以做這樣的事情:

public static java.sql.Date sumarFechasDias(java.sql.Date fch, int days) { 
    Calendar cal = new GregorianCalendar(); 
    cal.setTimeInMillis(fch.getTime()); 
    cal.add(Calendar.DATE, days); 
    return new java.sql.Date(cal.getTimeInMillis()); 
} 

如果天= 30,它將返回添加了30天的日期。