# Date-Objekt um einen Monat "erhöhen"



## Hobbes (7. Nov 2009)

Hallo allerseits,

ich habe ein Date-Objekt (ja, ich weiß, dass es veraltet ist. Aber ich habe es trotzdem ) Ich brauche jetzt ein weiteres Date-Objekt, das einen Monat später ist.

Solange das Datum in der Mitte des Monats ist (z.B. 18.3.2008) ist es kein Problem. Da würde ich ein Calendar-Objekt erstellen, dort die Änderung durchführen und anschließend wieder ein Date-Objekt erstellen.

Nun kommt aber das Problem, dass nicht jeder Monat mehr als 28 Tage hat. Wenn also der Tag größer als 28 ist, möchte ich den Monatsletzten des nächsten Monats erhalten. Beispiel: ich habe den 30.9.2008 und möchte als Ergebnis den 31.10.2008 bekommen. Der nächste Monatsletzte wäre der 30.11.2008.

Mit aufwändigen Abfragen würde mir das möglicherweise gelingen. Aber gibt es auch eine vergleichsweise einfache Möglichkeit?


```
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class AdjustDate {
	public static void main(String args[]) {
		Date dt = new Date();
		Date dt2 = AdjustDate.addOneMonth(dt);
		System.out.println(dt2);
	}

	public static Date addOneMonth(Date dt) {
		GregorianCalendar cal = new GregorianCalendar();
		cal.setTime(dt);
		if (cal.get(Calendar.DAY_OF_MONTH) <= 28) {
			cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + 1);
		} else {
			// setze auf den Monatsletzten des nächsten Monats
		}
		return cal.getTime();
	}
}
```

Stunden und Minuten sind übrigens egal. Die sind bei mir alle auf 0 gesetzt. Mich interessiert also lediglich das Datum.

Gruß
Hobbes


----------



## miwoe (7. Nov 2009)

Hab mal nach einer Klasse DateUtils gegoogelt und das gefunden:

Koders Code Search: DateUtil.java - Java

Kann man sich aber alles selbst gut selbst zusammenbasteln. So eine Aufwändige Abfrage ist es gar nicht. Für deinen Fall würde eine while-Schleife, eine temporäre Variable und ein if vermutlich reichen.


----------



## Hobbes (8. Nov 2009)

Danke, das werde ich mir in den nächsten Tagen mal in Ruhe anschauen. Wenn ich Fragen habe, melde ich mich nochmal


----------



## André Uhres (8. Nov 2009)

Versuch's mal so:

```
public static Date addOneMonth(Date dt) {
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(dt);
    cal.add(Calendar.MONTH, 1);
    return cal.getTime();
}
```
GregorianCalendar#add(..) macht nämlich genau das, was du brauchst


----------



## Hobbes (8. Nov 2009)

Danke, darauf kann ich aufbauen  Aber es macht nur *fast* das, was ich brauche. Wenn ich zum 31.8. einen Monat addiere, komme ich korrekterweise zum 30.9. Aber wenn ich dann noch einen Monat addiere, komme ich zum 30.10. Ich möchte aber zum 31.10. (wieder den Monatsletzten)

Gibt es eine Konstante für die Anzahl der Tage in einem Monat? Oder muss ich mir das selbst in einem Array anlegen?


----------



## SlaterB (8. Nov 2009)

zwei Stichworte: DAY_OF_MONTH + getMaximum/ getActualMaximum,
nun ruhig auch mal die Anleitung lesen (z.B. API)

GregorianCalendar (Java Platform SE 6)

noch ein anderer Trick:
auf Monatsersten setzen (wieder mit DAY_OF_MONTH), + 1 oder 2 Monate, -1 Tage


----------



## André Uhres (8. Nov 2009)

Hobbes hat gesagt.:


> Wenn ich zum 31.8. einen Monat addiere, komme ich korrekterweise zum 30.9. Aber wenn ich dann noch einen Monat addiere, komme ich zum 30.10. Ich möchte aber zum 31.10. (wieder den Monatsletzten)


So müsste es klappen:

```
public static Date addOneMonth(Date dt) {
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(dt);
    boolean max = cal.get(Calendar.DAY_OF_MONTH) == cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    cal.add(Calendar.MONTH, 1);
    if(max){
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    }
    return cal.getTime();
}
```


----------



## Hobbes (8. Nov 2009)

Alles klar. Vielen Dank 

@SlaterB

Bislang habe ich immer nur die Doku zur Klasse Calendar gelesen. Auf die Idee, dass GregorianCalendar noch zusätzliche Funktionen bietet, bin ich ehrlich gesagt gar nicht gekommen. Aber für die Zukunft weiß ich es


----------

