Jestem zmieszany. Po napotkaniu tego wątku próbowałem wymyślić, jak sformatować licznik czasu, który miał ten format hh:mm:ss
.
Oto moja próba -
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
Kiedy więc wypróbowuję wartość typu „ 3600000ms
dostaję” 01:59:00
, co jest błędne, ponieważ powinno być 01:00:00
. Oczywiście coś jest nie tak z moją logiką, ale w tej chwili nie widzę, co to jest!
Czy ktoś może pomóc?
Edytować -
Naprawione. Oto właściwy sposób na sformatowanie milisekund do hh:mm:ss
sformatowania -
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
Problem polegał na tym TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
. Powinno tak być TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
.
00:59:59
, powinno być01:00:00
.Odpowiedzi:
Byłaś naprawdę blisko:
Konwertujesz godziny na milisekundy, używając minut zamiast godzin .
BTW, podoba mi się korzystanie z
TimeUnit
API :)Oto kod testowy:
Wynik:
Zrozumiałem, że mój powyższy kod można znacznie uprościć, używając podziału modułu zamiast odejmowania:
Nadal używam
TimeUnit
API dla wszystkich magicznych wartości i daje dokładnie takie same wyniki.źródło
.replaceAll("^00:", "")
lub,.replaceAll("^00:(00:)?", "")
aby usunąć minuty i godziny, jeśli oba są równe zero."15:00"
i"10:00:23"
odpowiednio; usuwane są tylko zera wiodące , ponieważ dopasowanie jest zakotwiczone na początku wprowadzania przez^
.Ogólna metoda tego jest dość prosta:
źródło
String.format("%
02d:%02d:%02d", h,m,s)
?Jeśli używasz apache commons:
źródło
DurationFormatUtils.formatDurationHMS(timeInMS);
Użyłem tego:
Zobacz opis klasy Formatter .
Zobacz wykonalny przykład z wykorzystaniem danych wejściowych 2400 ms.
źródło
String.format()
strefy czasowej . Jednak idealna poprawna odpowiedź powinna być niezależna od strefy czasowej .String.format()
strefy czasowej . Jednak idealna poprawna odpowiedź powinna być niezależna od strefy czasowej .Zobacz wykonalny przykład z wykorzystaniem danych wejściowych 1200 ms.
źródło
źródło
Wyniki testu dla 4 wdrożeń
Konieczność wykonania dużego formatowania ogromnych danych wymagała najlepszej wydajności, więc oto (zaskakujące) wyniki:
dla (int i = 0; i <1000000; i ++) {FUNCTION_CALL}
Czas trwania:
formatTimeUnit: 2216 milisów
źródło
StringBuilder
a potem popełniłeś błąd, używając „0” + rodzaj „ruiny”. @mre GC JVM jest wyjątkowo dobry w przydzielaniu i zbieraniu wielu krótkotrwałych obiektów, nie martw się. PoszedłemString.format
bez logiki wiodącej zero.Idąc za odpowiedzią Czecha, nie musimy używać TimeUnit, aby znaleźć znaną wartość. Byłby o wiele bardziej optymalny kod
Mam nadzieję, że to pomoże
źródło
millisLeft%1000/10
więc otrzymujemy formathour:minutes:seconds:milliseconds
millisLeft%1000
źródło
to zadziałało dla mnie z Kotlin
źródło
Java 9
To drukuje:
Robisz dobrze, pozwalając, aby metody biblioteczne przeprowadzały za ciebie konwersje.
java.time
, nowoczesny interfejs API daty i godziny Java, a ściślej jegoDuration
klasa robi to bardziej elegancko i mniej podatnie na błędy niżTimeUnit
.toMinutesPart
itoSecondsPart
metody użyłem zostały wprowadzone w Javie 9.Java 6, 7 i 8
Dane wyjściowe są takie same jak powyżej.
Pytanie: Jak to działa w Javie 6 i 7?
java.time
jest wbudowany.org.threeten.bp
z podpakietów.Spinki do mankietów
java.time
.java.time
został po raz pierwszy opisany.java.time
do Java 6 i 7 (ThreeTen dla JSR-310).źródło
Poniższy kod wykonuje konwersję w obie strony
23: 59: 58: 999 do 86398999
i niż
86398999 do 23: 59: 58: 999
źródło
Format: 00: 00: 00.000
Przykład: 615605 Millisecend
00: 10: 15.605
źródło
Odpowiedź oznaczona jako poprawna ma mały błąd,
na przykład jest to przykład wartości, którą otrzymuję:
Oto rozwiązanie pozwalające uzyskać właściwy format:
uzyskanie w rezultacie poprawnego formatu:
inną opcją uzyskania formatu
hh:mm:ss
jest po prostu:źródło
Próbowałem, jak pokazano w pierwszej odpowiedzi. Działa, ale minus wprawił mnie w zamieszanie. Moja odpowiedź Groovy:
źródło
Dla Kotlina
gdzie
milSecs
jest milisekundamiźródło
Możesz spróbować czegoś takiego:
konwertować milisekundy na wartość czasu
źródło