Zum Inhalt springen

Zeitspanne(millisekunden) in "hh:mm:ss" konvertieren?


Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich nehme in meinem Programme eine Zeitmessnung vor, wie lange die Verarbeitung dauert.

Dazu holen ich mir vor und nach der Verarbeitung die Zeit mit Date.getTime() und subtrahiere die Startzeit von der Endzeit.

Nun habe ich die Dauer in Millisekunden.

Wie kann ich das jetzt am geschicktestens im Format "hh:mm:ss" darstellen?

Ich hab schon probiert mit der Dauer ein Objekt der Klasse 'time' zu erzeugen und mir über die toString()-Methode die Zeit zurückgeben zu lassen, allerdings schlägt das Fehl. Damit kriege ich eine Verarbeitungsdauer über eine Stunde angezeigt obwohl sie knapp über einer Minute lag.

Hat da jemand noch einen Tip für mich?

Am besten bitte mit Beispiel, ich blick durch diese Formatierungsklassen nicht so ganz durch.

Danke & Gruß

LordK

Geschrieben

Ich geb zwar keine Garantie aber theoretisch sollte das so gehen:


Date duration = new date(duration);


String datePattern = "HH:mm:ss";


SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);


String formattedTimestamp = simpleDateFormat.format();


Solange duration<24std. sollte das "eigentlich" funktionieren.

Allerdings ist ja bei duration>24std dummerweise 1 tag verstrichen.

so ist das bei nem datum nunmal.

daher würde es sich anbieten das selbst zu schreiben.

ich hab auch irgendwann mal eine Klasse bei Apache gefunden (Jakarta Library) die Durations formatiert.

mfg

Eth

Geschrieben

String formattedTimestamp = simpleDateFormat.format();

Dem Formataufruf müsste allerdings noch das duration Date übergeben werden. Sonst weiß er ja nicht welches Datum formatiert werden soll.

Geschrieben

Huch, ja guter punkt also nochmal kurz (iss der edit-button wech?!?):


Date duration = new date(duration);


String datePattern = "HH:mm:ss";


SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);


String formattedTimestamp = simpleDateFormat.format(duration);

Geschrieben

Danke für die Antworten,

aber irgendwie habe ich damit das selbe Problem wie mit der Time Klasse.

Die Verarbeitungsdauer wird auch mit über einer Stunde angezeigt.

Naja ich hab mir jetzt meine eigene Methode dafür geschrieben.

Hoffe mal, das die Berechnungen stimmen ;)

Gruß

LordK

Geschrieben
Huch, ja guter punkt also nochmal kurz (iss der edit-button wech?!?):


Date duration = new date(duration);


String datePattern = "HH:mm:ss";


SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);


String formattedTimestamp = simpleDateFormat.format(duration);

Tolle Sache wenn man jdk 5.0 verwendet. Kleiner Schönheitsfehler noch: Bei dem obigen Beispiel werden nicht die Millisekunden angezeigt, dafür aber die aktuelle Stunde. Die möglichen Patterns findet man in der API, oder hier:

public static void main (String[] args){

		System.out.println("letz go...");

		Verarbeitungsdauer myDauer = new Verarbeitungsdauer();

		long start = System.currentTimeMillis();

		myDauer.doSometing();

		long ende = System.currentTimeMillis();		

		System.out.println("Millisekunden: " + (ende - start));

		String datePattern = "mm:ss:S";	

		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);

		String formattedTimestamp = simpleDateFormat.format(new Date(ende - start));

		System.out.println("Dauer: " + formattedTimestamp );

		System.out.println("...finish!");

	}

Geschrieben
Was davon ist denn aus dem jdk5.0 benutze 1.4.2_07 und es funktioniert

Nehme die Aussage zurück, hatte die Klasse SimpleDateFormat zuvor nur im neuen jdk gesehen, gibts aber wohl schon länger

Geschrieben
hatte die Klasse SimpleDateFormat zuvor nur im neuen jdk gesehen, gibts aber wohl schon länger
Schon deutlich länger, war quasi immer schon mit dabei gewesen.

Zurück zum Thema:

  private static final NumberFormat TF          = new DecimalFormat("00");


  /**

   * Formats the given time as [hours:minutes:seconds]

   */

  public static String formatTime(long time) {


    double timeAsSeconds                        = Math.max(time, 0) / 1000;

    double pSeconds                             = timeAsSeconds % 60;


    double timeAsMinutes                        = (timeAsSeconds - pSeconds) / 60;

    double pMinutes                             = timeAsMinutes % 60;


    double timeAsHours                          = (timeAsMinutes - pMinutes) / 60;

    double pHours                               = timeAsHours;


    StringBuilder response                      = new StringBuilder();

    response.append("[").append(TF.format(pHours < 0 ? 0 : Math.floor(pHours)));

    response.append(":").append(TF.format(pMinutes < 0 ? 0 : Math.floor(pMinutes)));

    response.append(":").append(TF.format(pSeconds < 0 ? 0 : Math.floor(pSeconds)));

    response.append("]");

    return response.toString();


  }

  • 2 Jahre später...
Geschrieben

Jahre später ...

Momentan sitze ich auch daran, die Differenz zweier Daten zu ermitteln. Dabei ist mir aufgefallen, daß

Date diff = new Date(endDate.getTime() - startDate.getTime())
"richtig arbeitet" und auch das Attribut "fasttime" von diff die richtige Differenz enthält. Beim Umwandeln mit
DateFormat.getTimeInstance(DateFormat.SHORT).format(diff.getTime())

werden allerdings aus 16.200.000 Millisekunden 5,5 Stunden statt 4,5. Wie kommt das?

Geschrieben

Servus,

ich vermute mal, dass das mit der Zeitzone zusammenhängt. DateFormat bzw. seine Implementierungen gehen ja bei einem Date von den Millisekunden seit dem 1.1.1970 aus. Wenn Du jetzt in einer um eine Stunde von der "Normalzeit" (Greenwich, denke ich) verschobenen Zeitzone bist, dann ist die Anzahl Millisekunden eine Uhrzeit.

Bei der Umrechnung von Millisekunden in eine absolute Stunden- oder Tagesanzahl ist DateFormat in der Regel nicht geeignet. Hier habe ich bis jetzt immer eigene Lösungen implementiert (so lange durch festgelegte Teiler teilen, bis die gewünschte Summe da ist.

Schöne Grüße,

Peter

Geschrieben

Für die Berechnung von Datums-Werten kann ich nur raten, von der Date-Klasse wegzugehen, und stattdessen die Klasse "java.util.GregorianCalendar" zu nutzen.

Die Date-Klasse ist mittlerweile depricated; zudem bietet der GC verbesserte Methoden zum Berechnen und Umwandeln

Gruß

Die Lady

Geschrieben
Die Date-Klasse ist mittlerweile depricated
Mit Sicherheit nicht! Es gibt eine ganze Reihe von Methoden, die als deprecated gekennzeichnet sind, die Klasse an sich ist dies aber nicht (und das auch aus guten Gründen).

zudem bietet der GC verbesserte Methoden zum Berechnen und Umwandeln
Na wenn schon, dann auch richtig. java.util.GregorianCalendar ist eine konkrete Implementierung. Verwendet werden sollte dann java.util.Calendar.
Geschrieben
Mit Sicherheit nicht! Es gibt eine ganze Reihe von Methoden, die als deprecated gekennzeichnet sind, die Klasse an sich ist dies aber nicht (und das auch aus guten Gründen).

Da hast du Recht. Hab mich zu ungenau ausgedrückt. Danke für den Hinweis

Na wenn schon, dann auch richtig. java.util.GregorianCalendar ist eine konkrete Implementierung. Verwendet werden sollte dann java.util.Calendar.

Warum SOLLTE man java.util.Calendar nutzen? Habe bisher immer mit dem GregorianCalendar gearbeitet. Lerne auch gerne dazu :)

Gruß

Die Lady

Geschrieben
Warum SOLLTE man java.util.Calendar nutzen? Habe bisher immer mit dem GregorianCalendar gearbeitet. Lerne auch gerne dazu :)
Im Falle von Calendar ist es eher optisch als inhaltlich - wahrscheinlich werden wir so gut wie nie mit anderen Implementierungen als GregorianCalendar zu tun haben.

Aber dennoch: Eine gute Implementierung geht gegen Interfaces und nicht gegen konkrete Klassen (nun gut, Calendar ist eine abstrakte Klasse und kein Interface aber es geht ums Prinzip).

Ich verwende auch ArrayList nicht direkt sondern immer nur über das List Interface.

  • 8 Monate später...
Geschrieben

Der Thread ist zwar nicht mehr ganz taufrisch, aber für alle die, die in Zukunft an diesem Problem hängen und über Google hier herfinden, hier die Lösung:

Die Anzeige der Stunde liegt tatsächlich an der Zeitzone.

Beispiel:

long lTicks = 1088;

new SimpleDateFormat("HH:mm:ss.SSS").format(lTicks);

//wird in der Zeitzone GMT+1 ausgegeben als: "01:00:01.088"
Um die Zeitzone zu kompensieren kann folgendes angegeben werden:
long lTicks = 1088;

new SimpleDateFormat("HH:mm:ss.SSS").format(lTicks - 

           Calendar.getInstance().getTimeZone().getOffset(Calendar.ZONE_OFFSET));

//wird in jeder Zeitzone das gewünschte Ergebnis ausgeben: "00:00:01.088"

Viele Grüsse und allen einen schönen Tag!

Axel

Geschrieben (bearbeitet)

Über Calendar geht das prima.

Man muss nur den Calender erstmal auf 00:00:00 setzen und dann wenn man die millisekunden übergibt die bereits gesetzten Millisekunden draufrechnen:


Calendar cal = Calendar.getInstance();

// setze Zeit auf den 01.01.2000 um 00:00 Uhr

cal.set(2000,1,1,0,0,0);

// addiere die gemessenen Milliskeunden auf die bereits vorhandenen Millisekunden

cal.setTimeInMillis(cal.getTimeInMillis()+millis);

System.out.println(cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND));

Bearbeitet von speedi

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...