# mit Zeit Rechnen



## MScalli (21. Dezember 2009)

hi Leutz.
Ich versuche gerade bisschen mit Zeit zu Rechnen..
Hab ich schon paar mal gemacht und hat auch immer geklappt.. mehr oder weniger.


jetzt will ich die differenz 2er Zeiten berechnen und habs mal so gemacht..


```
private void berechneDifferenz(){
		
		int year 	= 2009;
		int month 	= 12 - 1;
		int day 	= 21;
		int hour 	= 20;
		int min 	= 0;
		int sec 	= 0;
		
		int year2 	= 2009;
		int month2 	= 12 - 1;
		int day2 	= 21;
		int hour2 	= 22;
		int min2 	= 0;
		int sec2 	= 0;
		
		Calendar cal_1 = new GregorianCalendar();
		cal_1.set( year, month, day, hour, min, sec );                      // erster Zeitpunkt
		
		Calendar cal_2 = new GregorianCalendar();
		cal_2.set( year2, month2, day2, hour2, min2, sec2 );                // zweiter Zeitpunkt
		
		long time1 = cal_2.getTimeInMillis() - cal_1.getTimeInMillis();
		DateFormat formatter1 = new SimpleDateFormat("HH:mm:ss");
		System.out.println(formatter1.format(new Date(time1)));				//  ergebnis = 03:00:00  müssten doch 2 STunden			

		long time2 = cal_2.compareTo(cal_1);
		DateFormat formatter2 = new SimpleDateFormat("HH:mm:ss");
		System.out.println(formatter2.format(new Date(time2)));				//  ergebnis = 01:00:00  müssten doch 2 STunden			
	}
```

irgendwie sind aber beide ergebnisse falsch und ich komm net drauf warum.
eigentlich will ich von einem Datum eine Zeit abziehen aber wenn nicht mal das klappt 

plz help


----------



## IT-Kerl (30. Dezember 2009)

Hi MScalli,

kurz gesagt, das JDK bietet keine Möglichkeit Zeit-Differenzen so abzubilden, wie Du es möchtest. Zeitberechnungen sind ein sehr komplexes Thema. Wahrscheinlich weißt Du, dass die Zeit in Java durch die Differenz zweier Daten in Millisekunden ausgedrückt wird.

```
public static void main(String[] args) {
		System.out.println(new Date(-2*1000)); // Thu Jan 01 00:59:58 CET 1970
		System.out.println(new Date(-1*1000)); // Thu Jan 01 00:59:59 CET 1970
		System.out.println(new Date(0));             // Thu Jan 01 01:00:00 CET 1970
		System.out.println(new Date(1*1000));  // Thu Jan 01 01:00:01 CET 1970
		System.out.println(new Date(2*1000)); // Thu Jan 01 01:00:02 CET 1970
	}
```
Wenn Du zwei dieser Zeitwerte subtrahierst, kann es sein, dass der neu entstandene Zeitwert in einen Zeitraum rutscht, in dem bspw. keine Sommer bzw. Winterzeit gab. In Deinem Beispiel bekommst Du den Zeitpunkt 1. Januar 1970 um 3 Uhr Morgens nach ETC.
Für einige Anwendungsbeispiele reicht es, wenn man die Differenz zurück in den ursprünglichen Zeitraum setzt. Ich habe Dein Programm etwas erweitert (und angepasst).

```
private void berechneDifferenz(){
		int year 	= 2009;
		int month 	= Calendar.DECEMBER;
		int day 	= 21;
		int hour 	= 20;
		int min 	= 0;
		int sec 	= 0;
		
		int year2 	= 2009;
		int month2 	= Calendar.DECEMBER;
		int day2 	= 21;
		int hour2 	= 22;
		int min2 	= 0;
		int sec2 	= 0;
		
		Calendar cal_1 = Calendar.getInstance();
		cal_1.set( year, month, day, hour, min, sec );                      // erster Zeitpunkt
		
		Calendar cal_2 = Calendar.getInstance();
		cal_2.set( year2, month2, day2, hour2, min2, sec2 );                // zweiter Zeitpunkt
		
		Calendar cal_3 = Calendar.getInstance();                            // eine Maske für die Differenz
		cal_3.set(year2, month2, day2, 0, 0, 0);
		
		long time1 = cal_2.getTimeInMillis() - cal_1.getTimeInMillis();
		DateFormat formatter1 = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
		System.out.println(formatter1.format(time1));				//  ergebnis = 01.01.1970 03:00:00 müssten doch 2 STunden			

		long time2 = cal_2.compareTo(cal_1);
		System.out.println(formatter1.format(time2));
		
		// hier mit Maske
		cal_3.setTimeInMillis(cal_3.getTimeInMillis()+time1);
		System.out.println(formatter1.format(cal_3.getTimeInMillis())); // 21.12.2009 02:00:00
	}
```
Ich hoffe, das konnte Deine Fragen beantworten. Ach bevor ich es vergesse... "compareTo" zeigt nur an, ob die Kalender-Objekte den gleichen Zeitraum anzeigen (compareTo = 0), oder ob der Zeitraum eines Kalenders vor (compareTo<0) oder nach dem Zeitraum des anderen Kalenders liegt (compareTo>0). Lies dazu bitte die API (http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html#compareTo(java.util.Calendar))

Grüße


----------

