Ich möchte die Zeit aufzeichnen, mit der System.currentTimeMillis()
ein Benutzer etwas in meinem Programm beginnt. Wenn er fertig ist, subtrahiere ich den Strom System.currentTimeMillis()
von der start
Variablen und möchte ihnen die verstrichene Zeit in einem für Menschen lesbaren Format wie "XX Stunden, XX Minuten, XX Sekunden" oder sogar "XX Minuten, XX Sekunden" anzeigen, weil dies der Fall ist Es ist unwahrscheinlich, dass jemand eine Stunde braucht.
Was ist der beste Weg, dies zu tun?
Antworten:
Verwenden Sie die
java.util.concurrent.TimeUnit
Klasse:Hinweis:
TimeUnit
ist Teil der Java 1.5-Spezifikation, wurde jedochtoMinutes
ab Java 1.6 hinzugefügt.Um eine führende Null für die Werte 0-9 hinzuzufügen, gehen Sie einfach wie folgt vor:
Wenn
TimeUnit
odertoMinutes
nicht unterstützt werden (z. B. unter Android vor API Version 9), verwenden Sie die folgenden Gleichungen:quelle
int hours = (int) ((milliseconds / (1000*60*60)) % 24)
das funktioniert nicht! stattdessen sollte es so seinint hours = (int) (milliseconds / (1000*60*60)) ;
String.format("%01d:%02d:%02d", hours, minutes, seconds);
Basierend auf der Antwort von @ siddhadev habe ich eine Funktion geschrieben, die Millisekunden in eine formatierte Zeichenfolge konvertiert:
quelle
1 Days 1 Hours 1 Minutes 1 Seconds
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;
Modulfunktion anstelle der Subtraktion verwenden: und auch die String.format-Methode:return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds", days, hours, minutes, seconds, milliseconds);
Drucke:
quelle
Duration dur = new Duration(start, end);
long millis = dur.getMillis();
DateTimeFormat.forPattern("mm:ss:SSS").print(new DateTime(time));
Oder konvertieren Sie die Dauer in einen Zeitraum, der automatisch mit einem Joda gedruckt werden kannPeriodFormatter
. Die Konvertierung kann zu Genauigkeitsverlusten führen, wenn keine andere ISO-Chronologie vorliegt. Angenommen, eine Dauer, die durch die Variable dargestellt wirdduration
.Period period = duration.toPeriod().normalizedStandard(PeriodType.time());
PeriodFormat.getDefault().print(period))
Die Ausgabe ist fantastisch: 1 Sekunde und 581 Millisekunden, Beantwortung der obigen Hauptfrage.Ähm ... wie viele Millisekunden sind in einer Sekunde? Und in einer Minute? Teilung ist nicht so schwer.
Fahren Sie so für Stunden, Tage, Wochen, Monate, Jahre, Jahrzehnte fort, was auch immer.
quelle
Verwenden des Pakets java.time in Java 8:
Die Ausgabe erfolgt nach ISO 8601. Dauer Format :
PT1M3.553S
(1 Minute und 3,553 Sekunden).quelle
Ich würde die zusätzliche Abhängigkeit nicht nur dafür heranziehen (die Aufteilung ist schließlich nicht so schwer), aber wenn Sie Commons Lang trotzdem verwenden, gibt es die DurationFormatUtils .
Anwendungsbeispiel (angepasst von hier ):
Beispiel:
Hinweis : Um Millis von zwei LocalDateTime-Objekten abzurufen, können Sie Folgendes verwenden:
quelle
Entweder Handunterteilungen oder die SimpleDateFormat-API verwenden .
Bearbeiten von Bombe : In den Kommentaren wurde gezeigt, dass dieser Ansatz nur für kleinere Zeiträume (dh weniger als einen Tag) funktioniert.
quelle
Nur um weitere Informationen hinzuzufügen, wenn Sie wie folgt formatieren möchten: HH: mm: ss
0 <= HH <= unendlich
0 <= mm <60
0 <= ss <60
benutze das:
Ich hatte gerade dieses Problem und habe es herausgefunden
quelle
Ich denke, der beste Weg ist:
quelle
Kürzeste Lösung:
Hier ist wahrscheinlich die kürzeste, die sich auch mit Zeitzonen befasst.
Welche Ausgänge zum Beispiel:
Erläuterung:
%tT
ist die für die 24-Stunden-Uhr formatierte Zeit als%tH:%tM:%tS
.%tT
Akzeptiert auch Longs als Eingabe, sodass keine erstellt werden mussDate
.printf()
druckt einfach die in Millisekunden angegebene Zeit, aber in der aktuellen Zeitzone müssen wir daher den Rohversatz der aktuellen Zeitzone subtrahieren, sodass 0 Millisekunden 0 Stunden und nicht der Zeitversatzwert der aktuellen Zeitzone sind.Hinweis Nr. 1: Wenn Sie das Ergebnis als benötigen
String
, können Sie es folgendermaßen erhalten:Hinweis 2: Dies liefert nur dann ein korrektes Ergebnis, wenn
millis
es weniger als einen Tag beträgt, da der Tagesteil nicht in der Ausgabe enthalten ist.quelle
long millis = 8398;
und wenn ich das anString.format("%tT", millis)
meine Ausgabe weitergebe, ist es 19:00:08. Woher kommen die 19?TimeZone.getDefault().getRawOffset()
, genau wie in der Antwort geschrieben:String.format("%tT", millis-TimeZone.getDefault().getRawOffset())
Joda-Zeit
Verwenden der Joda-Zeit :
quelle
PeriodFormat
in der letzten Zeile nicht nötig . Rufen Sie einfachPeriod::toString
an, um standardmäßig eine ISO 8601 Duration- Zeichenfolge zu erhalten.Bei einem erneuten Besuch des @ brent-nash-Beitrags könnten wir die Modulfunktion anstelle von Subtraktionen verwenden und die String.format-Methode für die Ergebniszeichenfolge verwenden:
quelle
für Android unter API 9
quelle
Für kleine Zeiten, weniger als eine Stunde, bevorzuge ich:
für längere Intervalle:
quelle
%tH
nur von 0 bis 23 Stunden zeigt? Das bedeutet, dass zum Beispiel 24 Stunden als angezeigt werden00
, 25 Stunden als01
... dasselbe Gültig für%tT
- Tage wird stillschweigend verworfen. Sicher, es könnten auch Tage angezeigt werden, aber das wäre ein Overkill für das Problem, das ich hatte, als ich dies schrieb (im Jahr 2011) [:-)Meine einfache Berechnung:
Viel Spaß beim Codieren :)
quelle
Hier ist eine Antwort basierend auf Brent Nash Antwort, Hoffnung, die hilft!
quelle
quelle
diff=diff-(hours*60*1000);
sollte seindiff=diff-(hours*60*60*1000);
. Ich habe versucht, es zu bearbeiten, aber die nervige Bearbeitungsrichtlinie von StackOverflow besagt, dass nicht genügend Zeichen für eine Bearbeitung vorhanden sind.Erstens
System.currentTimeMillis()
undInstant.now()
sind nicht ideal für das Timing. Beide melden die Wanduhrzeit, die der Computer nicht genau kennt und die sich unregelmäßig bewegen kann, einschließlich des Rückwärtsgehens, wenn beispielsweise der NTP-Dämon die Systemzeit korrigiert. Wenn Ihr Timing auf einem einzelnen Computer stattfindet, sollten Sie stattdessen System.nanoTime () verwenden. .Zweitens ist java.time.Duration ab Java 8 der beste Weg, um eine Dauer darzustellen:
quelle
Wenn Sie wissen, dass der Zeitunterschied weniger als eine Stunde beträgt, können Sie den folgenden Code verwenden:
Es ergibt sich: 51:00
quelle
Diese Antwort ähnelt einigen Antworten oben. Ich bin jedoch der Meinung, dass dies von Vorteil ist, da dadurch im Gegensatz zu anderen Antworten zusätzliche Kommas oder Leerzeichen entfernt werden und die Abkürzung behandelt wird.
quelle
Es gibt ein Problem. Wenn Millisekunden 59999 sind, ist es tatsächlich 1 Minute, aber es wird als 59 Sekunden berechnet und 999 Millisekunden gehen verloren.
Hier ist eine modifizierte Version, die auf früheren Antworten basiert und diesen Verlust beheben kann:
quelle
Dies ist in Java 9 einfacher:
Dies erzeugt eine Zeichenfolge wie
0 hours, 39 mins, 9 seconds
.Wenn Sie vor dem Formatieren auf ganze Sekunden runden möchten:
So lassen Sie die Stunden weg, wenn sie 0 sind:
Jetzt können wir zum Beispiel haben
39 mins, 9 seconds
.Um Minuten und Sekunden mit führender Null zu drucken, um sie immer zweistellig zu machen, fügen Sie einfach
02
in die entsprechenden Formatspezifizierer ein, also:Jetzt können wir zum Beispiel haben
0 hours, 39 mins, 09 seconds
.quelle
if
-else
da.Für korrekte Zeichenfolgen ("1 Stunde, 3 Sekunden", "3 Minuten", aber nicht "0 Stunden, 0 Minuten, 3 Sekunden") schreibe ich diesen Code:
quelle
Ich habe die Antwort von @MyKuLLSKI geändert und die Plurlisierungsunterstützung hinzugefügt. Ich habe Sekunden herausgenommen, weil ich sie nicht brauchte. Sie können sie jedoch jederzeit wieder hinzufügen, wenn Sie sie benötigen.
quelle
int intervalMins
vslong millis
Ich habe dies in einer anderen Antwort behandelt, aber Sie können tun:
Die Ausgabe ist so etwas wie
Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
mit den bestellten Einheiten.Es liegt an Ihnen, herauszufinden, wie Sie diese Daten entsprechend dem Zielgebietsschema internationalisieren können.
quelle
Verwenden Sie java.util.concurrent.TimeUnit und verwenden Sie diese einfache Methode:
Zum Beispiel:
quelle
DurationFormatUtils.formatDurationHMS (lang)
quelle