Zeitmessung

Hi,
ich wollte gern mal eine Laufzeitmessung meines Programmes machen. Folgender Code Brocken zeigt die wichtigsten Zeilen.

Code:
long startTime = System.currentTimeMillis();
     while(run) {
     //irgendwas tuhen
     
     long timeNow = System.currentTimeMillis();
     long diff = timeNow-startTime;
                
     SimpleDateFormat sdfTime = new SimpleDateFormat();
     sdfTime.applyPattern("HH:mm:ss");
     
     System.out.println(sdfTime.format(diff));

Wenn ich jetzt das Programm laufen lassen und nach ein paar Sekunden die Messung gemacht wird, dann ist die Ausgabe folgende. 01:00:21.
Wie kommt da die Differenz von über eine Stunde hin?(Programm läuft nicht so lange)

Die TimeZome ist korrekt eingestellt. Wenn ich mir die Variable diff mal ausgebe, dann stimmt auch das Ergebnis. Also muss der Fehler bei SimpleDateFormat liegen.

Ich hoffe das einer mir helfen kann.
 
Das Problem liegt darin, dass du eine Zeitdifferenz mit einer Klasse formatieren willst, die eigentlich mit Zeitpunkten arbeitet. Schreib dir am besten einfach eine eigene Funktion, die dir eine Anzahl von Millisekunden in Stunden, Minuten und Sekunden umrechnet.
 
Hallo!

...das ist alles eine Frage der "richtigen" Zeitzone:
Code:
/**
 * 
 */
package de.tutorials;

import java.text.SimpleDateFormat;
import java.util.TimeZone;

/**
 * @author Tom
 * 
 */
public class TimeDiff {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        long time = -System.currentTimeMillis();
        Thread.sleep(1500L);
        time += System.currentTimeMillis();
        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SSS");
        System.out.println(sdf.format(time));
    }
}

Gruss Tom
 
Hi,

Ich habe ein ähnliches Problem und habe den Thread über die Suchfunktion gefunden.
Leider funktioniert das bei mir aber nicht.

Wieso nicht?

Code:
System.out.println(sdf.format(time));
Fehlermeldung in Eclipse:
The method format(Date, StringBuffer, FieldPosition) in the type SimpleDateFormat is not applicable for the arguments (long)

Gruß und so
Loki2
 
Hallo!

Das klappt natuerlich nur dann mit primitiven longs , wenn diese in die Wrapper Klassen Gehuellt werden, oder das Autoboxing von Java 5 zum tragen kommt.
Als Alternative koenntest du mal folgendes versuchen:
Code:
System.out.println(sdf.format(Long.valueOf(time)));

System.out.println(sdf.format(new Date(time)));

Gruss Tom
 
Hallo zusammen.
Ich greife den Thread einfach noch mal auf. Ich komme an einer Stelle nicht weiter.

Ich möchte eine Methode haben, die mir die Anzahl der Jahre, Monate, Tage, usw. ausgibt.
Folgendes habe ich bereits:
Code:
public static String getZeitZwischenZweiZeitangaben(Calendar timestamp1, Calendar timestamp2)
    {
        String zeitraum = "";
        
        long time = 0;
        if(timestamp1.getTimeInMillis() > timestamp2.getTimeInMillis())
            time = timestamp1.getTimeInMillis() - timestamp2.getTimeInMillis();
        else
            time = timestamp2.getTimeInMillis() - timestamp1.getTimeInMillis();
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:d:HH:mm:ss:SSS");

        zeitraum = "Differenz: " + sdf.format(Long.valueOf(time));
        
        return zeitraum;
    }
Wie bekomme ich jetzt einen aussagekräftigen Rückgabewert hin, wie bspw.:
Differenz: 0 Jahre, 2 Monate, 3 Tage, 4, Stunden, 5 Miniuten und 6 Sekunden
Die Millisekunden sind nicht wichtig :)

Danke schon mal für eure Hilfe! :)
Gruß
der Gerrit
 
Guten Morgen.
Möchte euch meine Lösung nicht vorenthalten.
Habe mir diese Lib zur Hilfe besorgt: http://joda-time.sourceforge.net/faq.html#datediff

Der Code schaut dann (bis jetzt) so aus:
Code:
    /**
     * Ermittelt die Zeitspanne zwischen zwei Zeitpunkten.<br />
     * <br />
     * Ist <code>timestamp1<code> kleiner als <code>timestamp2</code>, wird das Ergebnis negativ.
     * 
     * @param timestamp1
     * @param timestamp2
     * @return Zeitspanne
     */
    public static String getZeitZwischenZweiZeitangaben(Calendar timestamp1, Calendar timestamp2)
    {
        Period p = new Period(timestamp1.getTimeInMillis(), timestamp2.getTimeInMillis(), PeriodType.yearMonthDayTime());
        StringBuffer sb = new StringBuffer("Differenz: ");
        boolean setSep = false;
        
        if(p.getYears() != 0) {
            sb.append(p.getYears() + " Jahr");
            if(Math.abs(p.getYears()) > 1) sb.append("e");
            setSep = true;
        }
        if(p.getMonths() != 0) {
            if(setSep) { sb.append(", "); }
            sb.append(p.getMonths() + " Monat");
            if(Math.abs(p.getMonths()) > 1) sb.append("e");
            setSep = true;
        }
        if(p.getDays() != 0) {
            if(setSep) { sb.append(", "); }
            sb.append(p.getDays() + " Tag");
            if(Math.abs(p.getDays()) > 1) sb.append("e");
            setSep = true;
        }
        if(p.getHours() != 0) {
            if(setSep) { sb.append(", "); }
            sb.append(p.getHours() + " Stunde");
            if(Math.abs(p.getHours()) > 1) sb.append("n");
            setSep = true;
        }
        if(p.getMinutes() != 0) {
            if(setSep) { sb.append(", "); }
            sb.append(p.getMinutes() + " Minute");
            if(Math.abs(p.getMinutes()) > 1) sb.append("n");
            setSep = true;
        }
        if(p.getSeconds() != 0) {
            if(setSep) { sb.append(", "); }
            sb.append(p.getSeconds() + " Sekunde");
            if(Math.abs(p.getSeconds()) > 1) sb.append("n");
            setSep = true;
        }
        
        return sb.toString();
    }
Vielleicht hilft das ja einem von euch :)
Gruß
der Gerrit
 
Zurück