tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
11311
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DerKleineVomSee DerKleineVomSee ist offline Mitglied Silber
    Registriert seit
    Nov 2005
    Beiträge
    70
    Hi,
    ich wollte gern mal eine Laufzeitmessung meines Programmes machen. Folgender Code Brocken zeigt die wichtigsten Zeilen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    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.
     

  2. #2
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.805
    Blog-Einträge
    5
    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.
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    ...das ist alles eine Frage der "richtigen" Zeitzone:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    /**
     * 
     */
    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
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    DerKleineVomSee DerKleineVomSee ist offline Mitglied Silber
    Registriert seit
    Nov 2005
    Beiträge
    70
    Genau das war das Problem. Folgende Zeile hat gefehlt.

    Code :
    1
    
    TimeZone.setDefault(TimeZone.getTimeZone("GMT"));

    Dank für die schnelle Hilfe.
     

  5. #5
    Loki2 Loki2 ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Beiträge
    157
    Hi,

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

    Wieso nicht?

    Code :
    1
    
    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
     

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    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 :
    1
    2
    3
    
    System.out.println(sdf.format(Long.valueOf(time)));
     
    System.out.println(sdf.format(new Date(time)));

    Gruss Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  7. #7
    Loki2 Loki2 ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Beiträge
    157
    So funktioniert es.

    Vielen Dank.
     

  8. #8
    Kryptaesthesie Kryptaesthesie ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    127.0.0.1
    Beiträge
    189
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    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
     

  9. #9
    Kryptaesthesie Kryptaesthesie ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    127.0.0.1
    Beiträge
    189
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    
        /**
         * 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
     

Ähnliche Themen

  1. [C++] Zeitmessung in Millisekunden
    Von Jellysheep im Forum C/C++
    Antworten: 9
    Letzter Beitrag: 01.06.10, 23:11
  2. Zeitmessung in Mulitthreadanwendung
    Von Perdan im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 26.11.09, 10:52
  3. Zeitmessung
    Von CodeFatal im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 06.01.06, 08:18
  4. Timer (zur Zeitmessung)
    Von Svartr im Forum Borland CBuilder und VCL
    Antworten: 3
    Letzter Beitrag: 02.04.05, 13:45
  5. Simple Zeitmessung für Kundenaufträge
    Von fercules im Forum Microsoft Windows
    Antworten: 0
    Letzter Beitrag: 08.10.04, 10:27