# Zeitmessung mit Java



## cluening (7. Feb 2006)

Tach Post,

ich möchte gerne den Zeitverbrauch messen den ein JavaProgramm braucht um eine gewünschte 
Aktion durchzuführen. Beispielsweise einen Compileprozess (hier als while-Schleife) dargestellt.

Um die Zeit dann nachher in der Datenbank abzuspeichern brauche ich aber nur den Unterschied 
zwischen 2 Zeiten. Ich möchte nachher aber eine Ausgabe haben die mir die Zeit vernüntig darstellt:
Stunden:Minuten:Sekunden:Evtl. Millisekunden.

Wenn ich dieses Programm so laufen lasse bekomme ich eine Ausgabe:
danach: 313
Berechnete Sache: 01:00:00:313

Warum schreibt er mir vorne eine 01 bei Stunden hin das hat doch nur Millisekunden gedauert ?


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

public class Zeitmessung {
		public static void main(String [] args)
		{
			long vorher = System.currentTimeMillis();
			int i = 0;
			while(i < 10000)
			{
				i++;
			}
			long danach = (System.currentTimeMillis() - vorher);	
			System.out.println("danach:"+danach);
			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
			Date berechnet = new Date(danach);
			System.out.println("Berechnete Sache:"+ sdf.format(berechnet));
		}
}
```

bis denn
cluening


----------



## SlaterB (7. Feb 2006)

Tipp:
es interessier bei deinem Problem eigentlich wenig was du da so messen möchtest oder wie deine formatierte Ausgabe aussieht,
durch 2 Min. nachdenken läßt sich dein Problem vereinfachen zu


```
import java.util.*;

public class Test {

	public static void main(String[] args) throws Exception {
		Date d = new Date(313);
		System.out.println(d.getHours());
	}
}
```
mit der Frage 'wieso kommt hier als Stunde 1 raus?'

----------------

aus der API:

public Date(long date)

    Allocates a Date object and initializes it to represent the specified number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 00:00:00 GMT.



public int getHours()

    Deprecated. As of JDK version 1.1, replaced by Calendar.get(Calendar.HOUR_OF_DAY).

    Returns the hour represented by this Date object. The returned value is a number (0 through 23) representing the hour within the day that contains or begins with the instant in time represented by this Date object, as interpreted in the local time zone.

------------------

vielleicht ist die deutsche Zeit einfach ne Stunde später dran so dass es hier schon 1 Uhr 313 ms ist?


mit 

```
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
 sdf.setTimeZone(TimeZone.getTimeZone("GMT+00"));
```
scheint es besser zu funktionieren


----------



## 0xdeadbeef (7. Feb 2006)

Kurz zusammengefaßt: es ist eine Uhrzeit. Und weil Deutschland in der Tat in der Zeitzone GMT+1h liegt, wird aus 0 Uhr GMT eine deutsche Ortszeit von 1 Uhr.


----------



## cluening (7. Feb 2006)

Da kann ich Euch leider nicht ganz folgen ich frage doch bei beiden 
mit System.currentMillis ab. Bei beiden kommt ein long raus. 

Java ist manchmal schon ganz schön komisch


----------



## 0xdeadbeef (7. Feb 2006)

Es liegt nicht an den Millis, sondern am DateFormat. Du sagst ihm quasi: "stelle mir diese 313ms als Uhrzeit dar" und nicht "stelle mir die 313ms als Stunden, Minuten, Sekunden und Millisekunden dar", was Du eigentlich willst.

Hat auch nichts mit Java zu tun, sondern daran, daß Du eine relative Zeitdifferenz in eine absolute Uhrzeit konvertierst.

Wobei ich mich ernsthaft frage, warum Du Stunden usw. nicht einfach selber ausrechnest


----------



## SlaterB (7. Feb 2006)

> Da kann ich Euch leider nicht ganz folgen ich frage doch bei beiden
> mit System.currentMillis ab. Bei beiden kommt ein long raus.

wie bei beiden? 
313 long sind 00:00:00:313 in GMT
und 01:00:00:313 in GMT +1, also deutscher Zeit,

die eine Stunde wegen deutscher Zeit, das ist das Problem, mehr nicht


----------



## cluening (8. Feb 2006)

Ok habs mittlerweile gerallt !

Danke
cluening  :wink:


----------

