2012-04-13 13 views
2

Ich erstelle J2SE-Anwendung und diese Anwendung muss zweimal in Millisekunden in eine Zeichenfolge formatieren, die das Intervall zwischen diesen beiden Zeiten darstellt.Wie formatiert man Zeitintervalle in Java?

long time1 = 1334331041677L; //Fri Apr 13 17:30:41 CEST 2012
long time2 = time1+1000*60*2; //Fri Apr 13 17:32:41 CEST 2012

und ich möchte so etwas wie "00.02.00" bekommen. Das wäre einfach, aber ich muss das Intervall formatieren, das von wenigen Sekunden bis zu mehreren Jahren reicht - also sollte die Bibliothek damit umgehen. Im Idealfall könnte diese Bibliothek das Intervall entsprechend den Gewohnheiten des Landes formatieren (falls vorhanden).

Ich habe die Fragen und Antworten durchsucht und die Lösung für mich könnte Jodatime oder Lang-Bibliothek von Apache Commons sein. Können Sie mir eine Empfehlung geben, welche Bibliothek von diesen meine Anforderungen besser löst? Vielen Dank im Voraus.

Antwort

1

PeriodFormat in Joda Time ist wahrscheinlich, was Sie wollen - aber Sie werden sehr sorgfältig darüber nachdenken müssen, wie Sie Werte von mehr als einem Tag formatieren möchten. Denken Sie daran, dass Monate und Jahre variable Längen haben - wenn Sie glücklich sind, die größte Einheit als Tag zu haben, würde das wahrscheinlich die Dinge einfach halten.

Sie sollten auch den Unterschied in Joda Time zwischen einer Period (die Dinge wie "Monate" enthalten können) und einer Duration, die eine feste Anzahl von Millisekunden ist, bewusst sein. Normalisierung zwischen den beiden berührt genau die oben genannten Probleme :) Grundsätzlich sollten Sie herausfinden, ob Sie an der Differenz in der verstrichenen Zeit zwischen zwei Zeitpunkte in der Zeit interessiert sind, oder die Differenz in "Kalender" Zeit zwischen zwei lokalen Datum/Zeitwerte. Zum Beispiel, zwischen Mitternacht und 2 Uhr morgens an einem bestimmten Datum in einer bestimmten Zeitzone kann 1 Stunde, 2 Stunden oder 3 Stunden der verstrichenen Zeit sein ...

+0

1) Ich suchte Jogatime API was ich konnte, aber ich konnte keinen Weg finden, einen formatierten Wert in der richtigen Weise zu erhalten, wenn es mehr als 24 Stunden ist. Z.B. Wenn die Differenz 2 Tage, 3 Stunden, 12 Minuten und 10 Sekunden beträgt, sollte "51:12:10" und nicht "02: 03: 12: 10" zurückgegeben werden. 2) Was ist das tatsächlich korrekt formatierte Zeitintervall? "51:12:10" oder "02: 03: 12: 10"? Löst es irgendeine Art von Verordnung oder hängt es von den Bedürfnissen jedes Programmierers ab? – Artegon

+0

@ user1315357: Was meinst du mit "richtig"?Es ist alles eine Frage dessen, was du willst. Aber Sie sollten in der Lage sein, 'PeriodFormat' zu erhalten, um das zu tun, was Sie wollen - Sie sollten den Zeitraum so konstruieren, dass nur die gewünschten Einheiten verwendet werden. Es ist schwer zu sagen, was du falsch machst, ohne deinen Code zu sehen. –

0

Wenn ich dich richtig verstanden habe, sollte folgendes (mit Joda Time) Hilfe

import org.joda.time.DateTime; 
import org.joda.time.Period; 

private String formatDuration(DateTime dt1, DateTime dt2) { 
    Period period = new Period(dt1, dt2); 
    String str = String.format("%s:%02d:%02d:%02d:%02d:%02d", 
    period.getYears(), period.getMonths(), period.getDays(), 
    period.getHours(), period.getMinutes(), period.getSeconds()); 
    // Ignoring milliseconds 

    String[] tokens = str.split(":"); 
    boolean currNonZero = false, flag = false, isFirst = true; 
    int ctr = 0, pos = 0; 
    StringBuilder sb = new StringBuilder(); 
    for (String token : tokens) { 
    pos++; 
    int val = Integer.parseInt(token); 
    currNonZero = (val > 0); 
    if ((ctr < 3 && (flag || currNonZero)) || (ctr == 0 && pos > 3)) { 
     if (isFirst) { isFirst = false; } 
     else { sb.append(":"); } 
     sb.append(token); 
     flag = (++ctr < 3); 
    } 
    } 

    return sb.toString(); 
} 

Ein paar Tests,

DateTime dt1 = new DateTime(2012, 1, 1, 8, 3, 5, 0); 
DateTime dt2 = new DateTime(2012, 1, 2, 9, 5, 6, 0); 
DateTime dt3 = new DateTime(2012, 2, 3, 11, 3, 5, 0); 
DateTime dt4 = new DateTime(2012, 2, 3, 11, 3, 10, 0); 
DateTime dt5 = new DateTime(2012, 2, 3, 11, 3, 10, 5); //5 millis away from dt4 

formatDuration(dt1, dt2); // Returns "01:01:01" 
formatDuration(dt1, dt3); // Returns "01:02:03" 
formatDuration(dt3, dt4); // Returns "00:00:05" 
formatDuration(dt4, dt5); // Returns "00:00:00" 
+0

Danke, ich werde versuchen, einige nicht so schwer zu finden. – Artegon

1

Sie Standard-Java-Calendar für Intervalle bis zu einem Tag verwenden können (24 Stunden). Es ist nicht möglich, diesen Trick für einen längeren Zeitraum zu verwenden (Tage, Jahre), obwohl ...

long start = System.currentTimeMillis(); 
/* 
* perform the measured activity here, 
* let's say it will take 2 minutes 5 seconds => 125 seconds => 125000ms 
*/ 
Thread.sleep(125 * 1000); 
long stop = System.currentTimeMillis(); 
Calendar c = Calendar.getInstance(); 
c.set(Calendar.HOUR_OF_DAY, 0); 
c.set(Calendar.MINUTE, 0); 
c.set(Calendar.SECOND, 0); 
c.set(Calendar.MILLISECOND, 0); 
c.setTimeInMillis(c.getTimeInMillis() + (stop - start)); 
DateFormat df = new SimpleDateFormat("HH:mm:ss.SSS"); 
System.out.println(df.format(c.getTime())); 
0

Nach this answer, das ist der effizienteste Weg, die verstrichene Zeit der Formatierung:

public static String combinationFormatter(final long millis) { 
    long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) 
      - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)); 
    long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) 
      - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)); 
    long hours = TimeUnit.MILLISECONDS.toHours(millis); 

    StringBuilder b = new StringBuilder(); 
    b.append(hours == 0 ? "00" : hours < 10 ? String.valueOf("0" + hours) : 
    String.valueOf(hours)); 
    b.append(":"); 
    b.append(minutes == 0 ? "00" : minutes < 10 ? String.valueOf("0" + minutes) : 
    String.valueOf(minutes)); 
     b.append(":"); 
    b.append(seconds == 0 ? "00" : seconds < 10 ? String.valueOf("0" + seconds) : 
    String.valueOf(seconds)); 
    return b.toString(); 
} 
0

Ausführliche Antwort: https://stackoverflow.com/a/39600534/5330578

Einfache Formatierung für die verstrichene Zeit weniger als 24h. Über 24 Stunden zeigt der Code nur die Stunden am nächsten Tag an und fügt den verstrichenen Tag nicht den Stunden hinzu.

Verwandte Themen