Saya bingung. Setelah menemukan utas ini , saya mencoba mencari tahu cara memformat penghitung waktu mundur yang memiliki format hh:mm:ss
.
Inilah usaha saya -
//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)));
Jadi, ketika saya mencoba nilai seperti 3600000ms
, saya dapatkan 01:59:00
, yang salah karena seharusnya 01:00:00
. Jelas ada yang salah dengan logika saya, tetapi saat ini, saya tidak dapat melihat apa itu!
Adakah yang bisa membantu?
Edit -
Memperbaikinya. Berikut cara yang tepat untuk memformat milidetik ke hh:mm:ss
format -
//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))));
Masalahnya adalah ini TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
. Seharusnya ini yang terjadi TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
.
00:59:59
, seharusnya01:00:00
.Jawaban:
Anda benar - benar dekat:
Anda mengonversi jam menjadi milidetik menggunakan menit, bukan jam .
BTW, saya suka Anda menggunakan
TimeUnit
API :)Berikut ini beberapa kode uji:
Keluaran:
Saya menyadari bahwa kode saya di atas dapat sangat disederhanakan dengan menggunakan divisi modulus alih-alih pengurangan:
Masih menggunakan
TimeUnit
API untuk semua nilai ajaib, dan memberikan output yang persis sama.sumber
.replaceAll("^00:", "")
atau.replaceAll("^00:(00:)?", "")
menghapus menit dan juga jam jika keduanya nol."15:00"
dan"10:00:23"
masing - masing; hanya terkemuka nol dihilangkan, karena pertandingan yang berlabuh untuk memulai input oleh^
.Metode generik untuk ini cukup sederhana:
sumber
String.format("%
02d:%02d:%02d", h,m,s)
?Jika Anda menggunakan apache commons:
sumber
DurationFormatUtils.formatDurationHMS(timeInMS);
Saya menggunakan ini:
Lihat deskripsi class Formatter .
Lihat contoh runnable menggunakan input 2400 ms.
sumber
String.format()
zona waktu . Namun, jawaban yang benar dan ideal harus independen dari zona waktu .String.format()
zona waktu . Namun, jawaban yang benar dan ideal harus independen dari zona waktu .Lihat contoh runnable menggunakan input 1200 ms.
sumber
sumber
Hasil tes untuk 4 implementasi
Setelah melakukan banyak pemformatan untuk data besar, diperlukan kinerja terbaik, jadi inilah hasilnya (mengejutkan):
untuk (int i = 0; i <1000000; i ++) {FUNCTION_CALL}
Durasi:
formatTimeUnit: 2216 mili
sumber
StringBuilder
kemudian membuat kesalahan dengan menggunakan "0" + nomor jenis "reruntuhan" itu. @re, JVM's GC sangat bagus dalam mengalokasikan dan mengumpulkan banyak objek yang berumur pendek, tidak perlu khawatir. Saya pergiString.format
tanpa logika nol untuk menangani.ini bekerja untuk saya, dengan kotlin
sumber
Pergi dengan jawaban Bohemian kita tidak perlu menggunakan TimeUnit untuk menemukan nilai yang diketahui. Akan jauh lebih optimal
Semoga ini bisa membantu
sumber
millisLeft%1000/10
jadi kami mendapatkan formatnyahour:minutes:seconds:milliseconds
millisLeft%1000
sumber
Jawa 9
Ini mencetak:
Anda melakukan hal yang benar dalam membiarkan metode perpustakaan melakukan konversi yang terlibat untuk Anda.
java.time
, API tanggal dan waktu Java modern, atau lebih tepatnya,Duration
kelasnya melakukannya dengan lebih elegan dan dengan cara yang tidak terlalu banyak kesalahan daripadaTimeUnit
.The
toMinutesPart
dantoSecondsPart
yang saya gunakan diperkenalkan di Jawa 9.Java 6, 7 dan 8
Outputnya sama seperti di atas.
Pertanyaan: Bagaimana cara kerjanya di Java 6 dan 7?
java.time
bawaan.org.threeten.bp
dengan subpackages.Tautan
java.time
.java.time
pertama kali dijelaskan.java.time
ke Java 6 dan 7 (ThreeTen untuk JSR-310).sumber
Kode di bawah melakukan konversi dengan kedua cara
23: 59: 58: 999 hingga 86398999
dan dari
86398999 hingga 23: 59: 58: 999
sumber
Format: 00: 00: 00.000
Contoh: 615605 Milidetik
00: 10: 15.605
sumber
Jawaban yang ditandai benar memiliki sedikit kesalahan,
misalnya ini adalah contoh dari nilai yang saya dapatkan:
Ini solusi untuk mendapatkan format yang tepat adalah:
mendapatkan format yang benar:
Pilihan lain untuk mendapatkan format
hh:mm:ss
adalah:sumber
Saya mencoba seperti yang ditunjukkan pada jawaban pertama. Ini bekerja, tetapi minus membawa saya ke dalam kebingungan. Jawaban saya oleh Groovy:
sumber
Untuk Kotlin
di mana,
milSecs
adalah milidetiksumber
Anda dapat mencoba sesuatu seperti ini:
untuk mengkonversi milidetik ke nilai waktu
sumber