Saya ingin memformat durasi dalam hitungan detik menggunakan pola seperti H: MM: SS. Utilitas saat ini di java dirancang untuk memformat waktu tetapi bukan durasi.
Saya ingin memformat durasi dalam hitungan detik menggunakan pola seperti H: MM: SS. Utilitas saat ini di java dirancang untuk memformat waktu tetapi bukan durasi.
Jika Anda menggunakan versi Java sebelum 8 ... Anda dapat menggunakan Joda Time dan PeriodFormatter
. Jika Anda benar-benar memiliki durasi (yaitu jumlah waktu yang telah berlalu, tanpa referensi ke sistem kalender) maka Anda mungkin harus menggunakan Duration
sebagian besar - Anda kemudian dapat menelepon toPeriod
(menentukan apa pun yang PeriodType
Anda ingin mencerminkan apakah 25 jam menjadi 1 hari dan 1 jam atau tidak, dll) untuk mendapatkan Period
yang dapat Anda format.
Jika Anda menggunakan Java 8 atau lebih baru: Saya biasanya menyarankan menggunakan java.time.Duration
untuk mewakili durasi. Anda kemudian dapat memanggil getSeconds()
atau sejenisnya untuk mendapatkan bilangan bulat untuk pemformatan string standar sesuai jawaban bobince jika Anda perlu - meskipun Anda harus berhati-hati dengan situasi di mana durasinya negatif, karena Anda mungkin ingin satu tanda negatif pada string output . Jadi sesuatu seperti:
public static String formatDuration(Duration duration) {
long seconds = duration.getSeconds();
long absSeconds = Math.abs(seconds);
String positive = String.format(
"%d:%02d:%02d",
absSeconds / 3600,
(absSeconds % 3600) / 60,
absSeconds % 60);
return seconds < 0 ? "-" + positive : positive;
}
Memformat cara ini cukup sederhana, jika mengganggu manual. Untuk parsing itu menjadi masalah yang lebih sulit secara umum ... Anda masih bisa menggunakan Joda Time bahkan dengan Java 8 jika Anda mau, tentu saja.
Duration
metode s:duration.toHours()
,duration.toMinutesPart()
danduration.toSecondsPart()
yang tersedia sejak Java 9. Dan untuk mendapatkan nilai absolut dapat menggunakanduration.abs()
.Jika Anda tidak ingin menyeret pustaka, cukup mudah untuk melakukannya sendiri menggunakan Formatter, atau pintasan terkait misalnya. diberikan jumlah integer detik s:
sumber
s/86400, (s%86400)/3600...
berhari-hari jika perlu ...s > 8640
0 (satu hari):"\u221E"
- infinitySaya menggunakan DurationFormatUtils dari Apache common seperti:
sumber
Ini lebih mudah sejak Java 9. Yang
Duration
masih tidak dapat diformat, tetapi metode untuk mendapatkan jam, menit dan detik ditambahkan, yang membuat tugas agak lebih mudah:Output dari snippet ini adalah:
sumber
sumber
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
sebelum menggunakanformat
fungsi.Ini mungkin semacam peretasan, tetapi ini adalah solusi yang bagus jika seseorang bertekad untuk mencapai ini menggunakan Java 8's
java.time
:sumber
Duration.ofSeconds(20)
), maka saya akan mendapatkanUnsupportedTemporalTypeException
). Saya hanya menghapus kode memeriksa apakah perbedaannya== 01
. Saya pikir01
itu semacam nilai masking yang saya tidak sepenuhnya mengerti, bisakah Anda menjelaskannya?isSupported
metode ini mengembalikan informasi jika ada bidang yang valid untuk ditampilkan pada string yang dapat dibaca manusia. Pokoknya "masking" sebenarnya bukan topeng. Kodereturn value!=0l
tidak menunjukkanreturn value!=01
. Silakan gunakan copy-paste lain kali.TemporalAccessor
tidak seharusnya disalahgunakan untuk jangka waktu. JSR-310 telah mendesain antarmukaTemporalAmount
untuk tujuan ini.L
untuk menandakanlong
nilai. Sangat mudah untuk salah membaca huruf kecill
untuk digit 1, seperti yang baru saja ditunjukkan.Berikut adalah satu lagi contoh cara memformat durasi. Perhatikan bahwa sampel ini menunjukkan durasi positif dan negatif sebagai durasi positif.
sumber
Jawaban ini hanya menggunakan
Duration
metode dan berfungsi dengan Java 8:sumber
Bagaimana dengan fungsi berikut, yang mengembalikan + H: MM: SS atau + H: MM: SS.sss
sumber
Ada pendekatan yang cukup sederhana dan elegan (IMO), setidaknya untuk jangka waktu kurang dari 24 jam:
DateTimeFormatter.ISO_LOCAL_TIME.format(value.addTo(LocalTime.of(0, 0)))
Pemformat memerlukan objek temporal untuk diformat, sehingga Anda dapat membuatnya dengan menambahkan durasi ke LocalTime 00:00 (yaitu tengah malam). Ini akan memberi Anda LocalTime yang menunjukkan durasi dari tengah malam hingga waktu itu, yang kemudian mudah diformat dalam notasi HH: mm: ss standar. Ini memiliki keuntungan karena tidak perlu perpustakaan eksternal, dan menggunakan perpustakaan java.time untuk melakukan perhitungan, daripada secara manual menghitung jam, menit dan detik.
sumber
Ini adalah opsi yang berfungsi.
Panggil metode dengan
Menghasilkan sesuatu seperti:
sumber
sumber
Perpustakaan saya Time4J menawarkan solusi berbasis pola (mirip dengan
Apache DurationFormatUtils
, tetapi lebih fleksibel):Kode ini menunjukkan kemampuan untuk menangani overflow jam dan menangani tanda tangan, lihat juga API formatter berdasarkan durasi .
sumber
Dalam scala (saya melihat beberapa upaya lain, dan tidak terkesan):
Terlihat mengerikan ya? Nah itu sebabnya kami menggunakan IDE untuk menulis hal ini sehingga metode ini memanggil (
$toHoursPart
dll) berbeda warna.The
f"..."
adalahprintf
/String.format
interpolator gaya tali (yang adalah apa yang memungkinkan$
kode injeksi bekerja) Mengingat output1 14:06:32.583
, yangf
tali interpolasi akan setara denganString.format("1 %02d:%02d:%02d.%03d", 14, 6, 32, 583)
sumber
menggunakan fungsi ini
sumber
Di Scala, membangun solusi YourBestBet tetapi disederhanakan:
sumber
dalam scala, tidak perlu perpustakaan:
sumber
Saya tidak melihat yang ini jadi saya pikir saya akan menambahkannya:
Ini hanya bekerja selama 24 jam tapi itu yang biasanya saya inginkan untuk durasi.
sumber