LordK Geschrieben 3. November 2005 Geschrieben 3. November 2005 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 Zitieren
geloescht_Newlukai Geschrieben 3. November 2005 Geschrieben 3. November 2005 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... Zitieren
etherius Geschrieben 3. November 2005 Geschrieben 3. November 2005 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 Zitieren
Pinhead Geschrieben 3. November 2005 Geschrieben 3. November 2005 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. Zitieren
etherius Geschrieben 3. November 2005 Geschrieben 3. November 2005 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); Zitieren
LordK Geschrieben 3. November 2005 Autor Geschrieben 3. November 2005 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 Zitieren
Knoppers Geschrieben 3. November 2005 Geschrieben 3. November 2005 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!"); } Zitieren
Pinhead Geschrieben 3. November 2005 Geschrieben 3. November 2005 Tolle Sache wenn man jdk 5.0 verwendet. Was davon ist denn aus dem jdk5.0 benutze 1.4.2_07 und es funktioniert Zitieren
Knoppers Geschrieben 3. November 2005 Geschrieben 3. November 2005 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 Zitieren
perdian Geschrieben 3. November 2005 Geschrieben 3. November 2005 hatte die Klasse SimpleDateFormat zuvor nur im neuen jdk gesehen, gibts aber wohl schon längerSchon 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(); } Zitieren
geloescht_Newlukai Geschrieben 24. September 2008 Geschrieben 24. September 2008 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? Zitieren
kingofbrain Geschrieben 25. September 2008 Geschrieben 25. September 2008 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 Zitieren
geloescht_Newlukai Geschrieben 25. September 2008 Geschrieben 25. September 2008 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. Zitieren
LadyPreis Geschrieben 26. September 2008 Geschrieben 26. September 2008 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 Zitieren
perdian Geschrieben 26. September 2008 Geschrieben 26. September 2008 Die Date-Klasse ist mittlerweile depricatedMit 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 UmwandelnNa wenn schon, dann auch richtig. java.util.GregorianCalendar ist eine konkrete Implementierung. Verwendet werden sollte dann java.util.Calendar. Zitieren
LadyPreis Geschrieben 26. September 2008 Geschrieben 26. September 2008 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 Zitieren
perdian Geschrieben 26. September 2008 Geschrieben 26. September 2008 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. Zitieren
Axel09 Geschrieben 13. Juni 2009 Geschrieben 13. Juni 2009 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 Zitieren
speedi Geschrieben 15. Juni 2009 Geschrieben 15. Juni 2009 (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 15. Juni 2009 von speedi Zitieren
Empfohlene Beiträge
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.