# Differenz in Monaten berechnen --- DateDiff()?



## bronks (3. Nov 2005)

Hi!

Es geht darum, aus 2 GregorianCalendar die Zeitdifferenz in Monaten zu berechnen.

Hier mein Code:

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

public class MonatSub {
  
    public static void main(String[] args) {
        try{
            SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
            Date date = new Date();

            GregorianCalendar cal1 = new GregorianCalendar();
            GregorianCalendar cal2 = new GregorianCalendar();
            
            date = fmt.parse("2004-11-02");
            cal1.setTime(date);
            date = fmt.parse("2005-08-03");
            cal2.setTime(date);

           //Was jetzt tun, um die Differenz in Monaten zu erhalten?

        }catch(Exception e){}
    }
}
```

Ich habe leider keine Funktion finden können, die mir die differenz zwischen cal1 und cal2 berechnet und mir die Anzahl der Monate ausgibt, welche dazwischen liegen.

Bitte gebt mir einen Tip wie man das in Java macht.

Danke

Bronks


----------



## The_S (3. Nov 2005)

Was willst du genau? Wie viele mathematische Monate (30 Tage) die beiden Daten auseinander liegen oder wie viele Monate vergangen sind?

Für ersteres würde ich mir die Millisekunden der beiden Daten ausgeben lassen, diese dann voneinander subtrahieren und dann einfach in Monate a 30 Tage umrechnen.

Bei Zweiterem einfach das jüngere Datum bestimmen und von diesem dann immer 1 Monat abziehen bis du das Jahr und den Monat des älteren Datums erreicht hast.

Du könntest auch mal die Suchfunktion benutzen, gibt schon massig Threads zu diesem Thema!


----------



## Sky (3. Nov 2005)

ganz trivial gelöst:

```
int y = cal2.get(Calendar.YEAR) - cal1.get(Calendar.YEAR);
    int m = cal2.get(Calendar.MONTH) - cal1.get(Calendar.MONTH);
    int diff = y*12 + m;
```


----------



## bronks (3. Nov 2005)

Definitiv weiß ich nur eines: Die massig Threads, die man in der Suche findet kauen immer den gleichem Mist durch, der auch in jedem kostenslosen Javabuch nachzulesen ist.

@Sky:
Danke für den Code. Den werde ich wahrscheinlich einsetzen, weil die Toleranz von +- 1 Monat bei mir keine Rolle spielt.

@All:
Hier mal ein bissl funktionierender VB-Code um das Problem nachvollziehen zu können. In PHP gibt es ebenfalls eine extra funktion dafür, die genauso funktioniert.

```
Dim date1 As Date
Dim date2 As Date

date1 = #10/11/2005#
date2 = #11/11/2004#

Debug.Print DateDiff("m", date2, date1)
```

Das richtige Ergebnis: 11 Monate.


----------



## Sky (3. Nov 2005)

```
SimpleDateFormat fmt = new SimpleDateFormat( "yyyy-MM-dd" );
    Date date = new Date();

    GregorianCalendar cal1 = new GregorianCalendar();
    GregorianCalendar cal2 = new GregorianCalendar();

    date = fmt.parse( "2005-10-11" );
    cal1.setTime( date );
    date = fmt.parse( "2004-11-11" );
    cal2.setTime( date );

    int y = cal2.get( Calendar.YEAR ) - cal1.get( Calendar.YEAR );
    int m = cal2.get( Calendar.MONTH ) - cal1.get( Calendar.MONTH );
    int diff = y * 12 + m;
    System.out.println( diff );
```

Ausgabe: 11


----------



## bronks (3. Nov 2005)

@sky:
Ja ... das Datumsformat!

Korrektur: Vielen Dank für den Code, den ich danken einsetzen werde!


----------



## Sky (3. Nov 2005)

bronks hat gesagt.:
			
		

> @sky:
> Ja ... das Datumsformat!
> 
> Korrektur: Vielen Dank für den Code, den ich danken einsetzen werde!


War/ist da ein Problem vorhanden ?


----------



## bronks (3. Nov 2005)

Nein! Ich habe nur im VB das Datum falsch eingegeben. Eigentlich meinte ich das so:

```
...
            date = fmt.parse("2005-11-10");
            cal1.setTime(date);
            date = fmt.parse("2004-11-11");
            cal2.setTime(date);
...
```
Das nur 11 Monate, weil ich nur die vollen Monate zählen muß.


----------



## bronks (4. Nov 2005)

OK! Ich habe es aufgegeben. Hab im Net mehrere Libs und Code gefunden. Insgesamt hat alles was ich gestern Nachmittag getestet habe nicht unter allen umständen richtig gerechnet. 

Meine Lösung: Ich schicke zwei Strings mit Zeitangaben an einen inteligenten und überaus zuverlässigen SqlServer von Microsoft und dieser liefert mir das richtige Ergebnis.


----------



## The_S (4. Nov 2005)

Geb mal ein paar umstände, die falsch gerechnet haben pls.


----------



## Sky (4. Nov 2005)

Es wäre denk ich einfacher gewesen, obige Rechnung zu verwenden und im Falle, dass Tag1 < Tag2 einen Monat abzuziehen.


----------



## Mag1c (4. Nov 2005)

bronks hat gesagt.:
			
		

> an einen inteligenten und überaus zuverlässigen SqlServer von Microsoft



was für eine plumpe Provokation  :bae: 

was willste denn nu berechnen ? Nur die ganzen Monate dazwischen, oder wie? Dann nimm das hier:


```
SimpleDateFormat fmt = new SimpleDateFormat( "yyyy-MM-dd" );

GregorianCalendar cal1 = new GregorianCalendar();
GregorianCalendar cal2 = new GregorianCalendar();

cal1.setTime(fmt.parse("2004-11-10"));
cal2.setTime(fmt.parse("2005-11-11"));

int diff = cal2.get(Calendar.YEAR) * 12 + cal2.get(Calendar.MONTH)
        - cal1.get(Calendar.YEAR) * 12 - cal1.get(Calendar.MONTH) - 1;

System.out.println( diff );
```

Gruß
Mag1c


----------



## Sky (4. Nov 2005)

bronks hat gesagt.:
			
		

> ```
> ...
> date = fmt.parse("2005-11-10");
> cal1.setTime(date);
> ...



Moment nochmal, was sind denn 'volle Monate' ? Vom 11.11.2004 bis zum 10.11.2005 sollen es 11 sein; bis zum 11.11.2005 dann 12, oder wie ? 
Falls ja, siehe mein Post oben -> Vergleich auf den Tag und u.U. korrigieren.


----------

