# Zeitdifferenz mit GregorianCalendar



## zx81 (25. Jan 2006)

Hallo,

Ich möchte die Differenz von zwei Datumswerten berechnen. Nach der Suche im Forum habe ich das ganze mit GregorianCalendar und getTimeInMillis probiert:

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

public class ZeitDiff {

	private static GregorianCalendar start;
	private static GregorianCalendar ende;
	private static GregorianCalendar diff = new GregorianCalendar();
	
	public static void main(String[] args) {
		//                            YY   MM  DD  hh  mm  ss
		start = new GregorianCalendar(2006, 1, 24, 22, 59, 00);
		ende  = new GregorianCalendar(2006, 1, 25, 23, 00, 00);

		diff.setTimeInMillis(ende.getTimeInMillis() - start.getTimeInMillis());
		
		System.out.println("START: " + start.get(Calendar.DAY_OF_MONTH) + "." +
									          start.get(Calendar.MONTH) + "." +
									          start.get(Calendar.YEAR) + "  " +
									          start.get(Calendar.HOUR_OF_DAY) + ":" + 
				                         start.get(Calendar.MINUTE) + ":" +
				                         start.get(Calendar.SECOND));
		
		System.out.println("ENDE : " + ende.get(Calendar.DAY_OF_MONTH) + "." +
				   					       ende.get(Calendar.MONTH) + "." +
				   					       ende.get(Calendar.YEAR) + "  " +
									          ende.get(Calendar.HOUR_OF_DAY) + ":" + 
	            			             ende.get(Calendar.MINUTE) + ":" +
	            			             ende.get(Calendar.SECOND));
		
		System.out.println("DIFF :\t\t   " + (diff.get(Calendar.HOUR_OF_DAY)-1) + ":" + 
	            			                   diff.get(Calendar.MINUTE) + ":" +
	            			                   diff.get(Calendar.SECOND));
	}
}
```

Dabei ergeben sich aber folgende Probleme / Fragen:

1. wenn Start- und Enddatum am selben Tag sind dann ist die Differenz eine Stunde zu groß (was ich in Zeile 32 durch Abziehen einer Stunde 'korrigiert' habe. Warum ist das so?

2. wenn Start- und Enddatum an zwei aufeinander folgenden Tagen sind, so wird die Differenz so berechnet, als wären Start- und Enddatum am selben Tag:


```
START: 24.1.2006  22:59:0
ENDE : 25.1.2006  23:0:0
DIFF :	   	   0:1:0
```

Anscheinend habe ich irgendwo einen Denkfehler? Habt ihr eine Idee?

Der Hintergrund der ganzen Sache ist, dass die Daten für Start- und Endzeit mit getTimestamp aus einer Datenbank gelesen werden, die Differenz berechnet werden muss, und diese dann in der Datenbank abgespeichert werden soll.

Danke für alle Tips!


----------



## The_S (26. Jan 2006)

1. Nein, ist garantiert nicht so
2. Ist auch net so. Du lässt dir ja schonmal nur Stunde, Minute und Sekunde ausgeben
3. (nur nebenbei) dir ist bewusst, dass Monat 1 der Februar ist!?
4. Du erzeugst aus der Differenz ein neues Datum, GregorianCalendar hat so seine Probleme mit dem Jahr 0 (musste ich auch immer wieder feststellen)
5. (folgt aus 4.) Berechne lieber aus der Diffeferenz in Millisekunden die Differenz in Tagen, Stunden, Minuten, ... da biste auf der sicheren Seite


----------



## Sky (26. Jan 2006)

Die Differenz aus 
	
	
	
	





```
ende.getTimeInMillis() - start.getTimeInMillis()
```
 zu erzeugen ist prinzipiell in Ordnung.

Die Differenz aber mittels "setTimeInMillis" wieder zu setzen in der Hoffnung fertig zu sein wird nicht funktionieren, da die 'millis' den *milliseconds after January 1, 1970, 0:00:00 * entsprechen. D.h. alle Differenzen die innerhalb eines Jahres liegen, werden zum Ergbnis "1970" haben...


----------



## The_S (26. Jan 2006)

Stimmt, das wars auch noch ...  

[edit]

Könnte man z. B. so machen (auf Tage, Stunden, Minuten, Sekunden begrenzt)


```
long diffMillis = date1.getTimeInMillis() - date2.getTimeInMillis();
double diffDay = diffMillis / 1000D / 60D / 60D / 24D; 
double diffHour = diffDay % 1 * 24;
double diffMin = diffHour % 1 * 60;
double diffSec = diffMin % 1 * 60;
```


----------



## Murray (26. Jan 2006)

Die Verwendung des GregorianCalendars kannst Du Dir auch ganz sparen, da bereits java.sql.Timestamp von java.util.Date die Methode getTime() erbt, die das gleiche liefert wie Calendar.getTimeInMillis.


----------



## zx81 (26. Jan 2006)

:toll: Danke für Eure Antworten... hab wieder einiges dazugelernt!

Trotzdem hätte ich noch eine ganz allgemeine Frage:

Wäre es evtl. sinnvoller, diese Berechnung direkt in der Datenbank durchzuführen (Trigger)? 
Als Vorteil sehe ich, dass ich mir doch ein bisschen was in der Anwendung sparen könnte (Zeiten lesen, Diff berechnen, Diff in DB schreiben).
Wäre das aus Performance- und Designgründen eine Alternative oder ist das im Endeffekt egal, wie ich es mache? Mich würde halt interessieren, wie man (ihr) das in der Praxis umsetzen würde(t).

Danke für eure Meinungen!


----------



## Sky (26. Jan 2006)

wie lautet denn die Anforderung überhaupt ? Wer muss wann welche Differenz warum berechnen...

Ohne Anforderung ist es schwer eine Lösung zu finden ;-)


----------

