Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

Ich wüßte jetzt keine Klasse um eine Dauer so darzustellen. Aber wozu kompliziert wenn es auch einfach geht?

Schreib' Dir eine Methode, die das ganze berechnet. So schwer ist das jetzt nicht. Die Millis haste ja...

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

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.

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);

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

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!");

	}

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

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...

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?

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

Dachte ich auch erst dran. Ich hab's ja auch mit einem Calendar und dem Setzen der TimeZone probiert ("GMT", "GMT+1", etc .). Hat auch nichts genutzt.

Sicher habe ich es vorerst (und wahrscheinlich auch letztendlich) selbst implementiert, aber komisch finde ich das schon.

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

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.
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

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...

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

Ü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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.