# Bitte helfen: Datum vergleichen?



## Schumi_86 (18. Mrz 2008)

Hallo,

ich hoffe mir kann jemand helfen. Drehe nämlich langsam durch. Also: Ich habe 2 Datums, Datümer, Daten wie auch immer das heißen mag. Diese will ich miteinander vergleichen. Das eine Datum hole ich mir als String aus einer Datei in der Form "20080315" (Also z.B. 15.3.2008). Das andere Datum soll das aktuelle sein. Jetzt möchte ich diese beiden so miteinander vergleichen, um dann zu wissen ob zwischen dem alten und dem aktuellen Datum mehr als 7 tage liegen. Ich bekomme es aber einfach nicht hin   

Mein Code etwas vereinfacht:


```
Calendar heute = new GregorianCalendar();
	    
                    // Beispielhaft mal irgendein vergangenes Datum
	    String lastUpdate = "20080315"

	    int day = Integer.parseInt(lastUpdate.substring(6, 8));
	    int month = Integer.parseInt(lastUpdate.substring(4, 6));
	    int year = Integer.parseInt(lastUpdate.substring(0, 4));
	            
	    Calendar neulich = new GregorianCalendar(day, month, year, 0,0,0);
	    neulich.add(Calendar.DAY_OF_MONTH, 7); 

                    if (neulich.after(heute)){
	        return false;
	    }
```

bin ich da auf dem richtigen Weg. Bekomme egal ob, der zeitraum größer oder kleiner als 7 tage ist einfach immer das selbe ergebnis  :bahnhof:


----------



## SlaterB (18. Mrz 2008)

schau dir doch mal den Konstruktor von GregorianCalendar an,
ob 2008 das Jahr oder der Tag ist, macht durchaus einen Unterschied 

überprüfe deine Berechnungen, indem du überall System.out.println() hinschreibst (oder Debugger)

-------

etwas einfacherer:

        String lastUpdate = "20080315";
        SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
        Date date = f.parse(lastUpdate);
        System.out.println(date);


----------



## Schumi_86 (18. Mrz 2008)

Hallo,

Vielen dank erstmal für deine Hilfe und deine guten Tipps. Habe jetzt weiter mal ein wenig rumprobiert und einiges abgeändert. Damit läuft es somit jetzt auch erstmal:


```
Calendar heute = new GregorianCalendar(); 
       
    // Beispielhaft mal irgendein vergangenes Datum 
    String lastUpdate = "20080315" 

    int day = Integer.parseInt(lastUpdate.substring(6, 8)); 
    int month = Integer.parseInt(lastUpdate.substring(4, 6)); 
    int year = Integer.parseInt(lastUpdate.substring(0, 4)); 
               
    Calendar neulich = new GregorianCalendar(year, month-1, day, 0,0,0); 
    neulich.add(Calendar.DAY_OF_MONTH, 7); 

    if (neulich.after(heute)){ 
        return false; 
    }
```

Mich wundert es aber warum ich bei dem monat eins abziehen muss. in der int variable month steckt eine 3. Wenn ich die -1 aber weglasse, dann bekomme ich den vierten Monat? kann ich das mit minus eins so machen, oder könnte es dadurch später zu Problemen kommen?



> etwas einfacherer:
> 
> String lastUpdate = "20080315";
> SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
> Date date = f.parse(lastUpdate);



Damit habe ich auch schon ein wenig rumprobiert. Habe es aber nicht hinbekommen bei dem Datum sieben Tage drauf zu rechnen. Gibt es da auch eine Möglichkeit?


----------



## SlaterB (18. Mrz 2008)

> Habe es aber nicht hinbekommen bei dem Datum sieben Tage drauf zu rechnen.
das Date musst du auch in einen Calendar stecken + dort rechnen,
da gibts dann aber ne einfache set-Operation, besser als mit Monaten zu hantieren

das mit den Monaten siehst du so richtig, nix schöner zu machen, soweit ich weiß,
Monat wird intern als 0-11 abgespeichert, vielleicht aus irgendwelchen historischen Gründen,
auf jeden Fall günstig, wenn man ein Array für die 12 Monate als String hat,
dann muss man dort nicht mehr -1 rechnen


----------



## schalentier (18. Mrz 2008)

Jo, beim GregorianCalendar musste 1 vom Monat abziehen. Darueber hab ich mich schon SEHR oft aufgeregt ;-)

Wenn du dir diesen ganzen komischen Mist sparen willst, nimm Joda Time.


```
DateMidnight date = new DateMidnight( 2008, 3, 15 );
DateMidnight today = new DateMidnight();

int days = Days.daysBetween( date, today ).getDays();
```


----------



## Schumi_86 (18. Mrz 2008)

> das Date musst du auch in einen Calendar stecken + dort rechnen,
> da gibts dann aber ne einfache set-Operation, besser als mit Monaten zu hantieren



Habs damit jetzt auch hinbekommen   


```
SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");      
	    Date date = f.parse(lastUpdate); 

	    GregorianCalendar neulich = new GregorianCalendar();
	    neulich.setTime(date);
	    neulich.add(Calendar.DAY_OF_MONTH, 7);
```


Vielen Dank nochmal für eure super Hilfe!


----------



## fehlerfinder (18. Mrz 2008)

Schumi_86 hat gesagt.:
			
		

> 2 Datums, Datümer, Daten wie auch immer das heißen mag


Mal ein wenig offtopic: es heißt "Daten" - siehe auch www.duden-suche.de, falls du mal wieder im Unklaren sein solltest ;-)


----------



## fehlerfinder (18. Mrz 2008)

schalentier hat gesagt.:
			
		

> beim GregorianCalendar musste 1 vom Monat abziehen. Darueber hab ich mich schon SEHR oft aufgeregt ;-)


Oder du verwendest die dafür vorgesehenen Konstanten, z.B. Calendar.MARCH - mache ich jetzt immer so, nachdem ich da auch mal ein paar zehn Minuten mit vertan habe.

Hilfreicher Link: Calendar-Konstanten


----------



## SlaterB (18. Mrz 2008)

sehr sinnvoll, wenn man den Monat aus einen String wie 12.3.2008 parst


----------



## schalentier (18. Mrz 2008)

Sag was du willst, ich bleibe dabei und finde die kompletten Datum-Sachen in Java von Sun sind einfach voellig vermurkst. Wenn man einen Monat mit Zahlen zwischen 0 und 11 angeben muss, ist das einfach nur extrem strange (Vom Sinn und Zweck des GregorianCalendar fang ich jetzt mal gar nicht an zu schreiben). 

Noch schlimmer als einem Java Beginner zu erklaeren, warum:

```
double foo = 5/12;
System.out.println(foo);
```
0.0 ergibt. :autsch: 

Aber wie gesagt, Joda Time hilft (jedenfalls beim Kalender). Irgendwo meine ich auch gelesen zu haben, das Joda evtl. vllt. mal ins JDK reinrutscht... *freu*.


----------



## Leroy42 (18. Mrz 2008)

fehlerfinder hat gesagt.:
			
		

> Schumi_86 hat gesagt.:
> 
> 
> 
> ...



Schon richtig, nur mir persönlich gefällt _Datumsdaten_ besser.


----------

