629 Stimmen

Wie konvertiert man Millisekunden in "X Minuten, x Sekunden" in Java?

Ich möchte die Zeit erfassen mit System.currentTimeMillis() wenn ein Benutzer etwas in meinem Programm beginnt. Wenn er fertig ist, subtrahiere ich den aktuellen System.currentTimeMillis() von der start und ich möchte ihnen die verstrichene Zeit in einem für den Menschen lesbaren Format wie "XX Stunden, XX Minuten, XX Sekunden" oder sogar "XX Minuten, XX Sekunden" anzeigen, denn es ist unwahrscheinlich, dass jemand eine Stunde braucht.

Wie kann man das am besten machen?

30voto

Thilo Punkte 248982

Ich würde nicht die zusätzliche Abhängigkeit nur für das ziehen (Division ist nicht so schwer, nach allem), aber wenn Sie Commons Lang sowieso verwenden, gibt es die DurationFormatUtils .

Verwendungsbeispiel (angepasst von aquí ) :

import org.apache.commons.lang3.time.DurationFormatUtils

public String getAge(long value) {
    long currentTime = System.currentTimeMillis();
    long age = currentTime - value;
    String ageString = DurationFormatUtils.formatDuration(age, "d") + "d";
    if ("0d".equals(ageString)) {
        ageString = DurationFormatUtils.formatDuration(age, "H") + "h";
        if ("0h".equals(ageString)) {
            ageString = DurationFormatUtils.formatDuration(age, "m") + "m";
            if ("0m".equals(ageString)) {
                ageString = DurationFormatUtils.formatDuration(age, "s") + "s";
                if ("0s".equals(ageString)) {
                    ageString = age + "ms";
                }
            }
        }
    }
    return ageString;
}   

long lastTime = System.currentTimeMillis() - 2000;
System.out.println("Elapsed time: " + getAge(lastTime)); 

//Output: 2s

Nota : Um millis von zwei LocalDateTime-Objekten zu erhalten, können Sie verwenden:

long age = ChronoUnit.MILLIS.between(initTime, LocalDateTime.now())

28voto

cadrian Punkte 7202

Entweder manuelle Divisionen, oder die SimpleDateFormat API .

long start = System.currentTimeMillis();
// do your work...
long elapsed = System.currentTimeMillis() - start;
DateFormat df = new SimpleDateFormat("HH 'hours', mm 'mins,' ss 'seconds'");
df.setTimeZone(TimeZone.getTimeZone("GMT+0"));
System.out.println(df.format(new Date(elapsed)));

Bearbeiten durch Bombe : Aus den Kommentaren geht hervor, dass dieser Ansatz nur für kleinere Zeiträume (d. h. weniger als einen Tag) funktioniert.

24voto

fredcrs Punkte 3478

Nur um weitere Informationen hinzuzufügen wenn Sie formatieren möchten wie: HH:mm:ss

0 <= HH <= unendlich

0 <= mm < 60

0 <= ss < 60

dies verwenden:

int h = (int) ((startTimeInMillis / 1000) / 3600);
int m = (int) (((startTimeInMillis / 1000) / 60) % 60);
int s = (int) ((startTimeInMillis / 1000) % 60);

Ich hatte gerade dieses Problem und habe folgendes herausgefunden

14voto

icza Punkte 335148

Die kürzeste Lösung:

Hier ist die wahrscheinlich kürzeste, die sich auch mit Zeitzonen befasst.

System.out.printf("%tT", millis-TimeZone.getDefault().getRawOffset());

Welche Ausgaben zum Beispiel:

00:18:32

Erläuterung:

%tT ist die Zeit, die für die 24-Stunden-Uhr wie folgt formatiert ist %tH:%tM:%tS .

%tT akzeptiert auch Longs als Eingabe, so dass keine Notwendigkeit besteht, eine Date . printf() wird einfach die in Millisekunden angegebene Zeit ausgeben, aber in der aktuellen Zeitzone. Daher müssen wir den Roh-Offset der aktuellen Zeitzone abziehen, so dass 0 Millisekunden 0 Stunden sind und nicht der Zeit-Offset-Wert der aktuellen Zeitzone.

Anmerkung #1: Wenn Sie das Ergebnis als String können Sie es so erhalten:

String t = String.format("%tT", millis-TimeZone.getDefault().getRawOffset());

Anmerkung #2: Dies ergibt nur dann ein korrektes Ergebnis, wenn millis ist kleiner als ein Tag, da der Tagesanteil in der Ausgabe nicht berücksichtigt wird.

13voto

Jose Tepedino Punkte 1344

Unter Bezugnahme auf den Beitrag von @brent-nash könnten wir die Modulus-Funktion anstelle von Subtraktionen verwenden und die String.format-Methode für die Ergebniszeichenfolge nutzen:

  /**
   * Convert a millisecond duration to a string format
   * 
   * @param millis A duration to convert to a string form
   * @return A string of the form "X Days Y Hours Z Minutes A Seconds B Milliseconds".
   */
   public static String getDurationBreakdown(long millis) {
       if (millis < 0) {
          throw new IllegalArgumentException("Duration must be greater than zero!");
       }

       long days = TimeUnit.MILLISECONDS.toDays(millis);
       long hours = TimeUnit.MILLISECONDS.toHours(millis) % 24;
       long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
       long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
       long milliseconds = millis % 1000;

       return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds",
                            days, hours, minutes, seconds, milliseconds);
   }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X