tl; dr
Konversi java.util.Date
objek usang Anda menjadi pengganti mereka java.time.Instant
,. Kemudian hitung waktu yang telah berlalu sebagai a Duration
.
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString (): PT2H34M56S
d.toMinutes (): 154
d.toMinutesPart (): 34
Format ISO 8601: PnYnMnDTnHnMnS
Standar masuk akal ISO 8601 mendefinisikan representasi tekstual singkat dari rentang waktu beberapa tahun, bulan, hari, jam, dll. Panggilan standar seperti rentang durasi . Formatnya adalah di PnYnMnDTnHnMnS
mana P
berarti "Periode", yang T
memisahkan bagian tanggal dari bagian waktu, dan di antaranya adalah angka diikuti oleh huruf.
Contoh:
P3Y6M4DT12H30M5S
tiga tahun, enam bulan, empat hari, dua belas jam, tiga puluh menit, dan lima detik
PT4H30M
Empat setengah jam
waktu java
The java.time kerangka dibangun ke Jawa 8 dan kemudian supplants tua merepotkan java.util.Date
/ java.util.Calendar
kelas. Kelas-kelas baru terinspirasi oleh kerangka kerja Joda-Time yang sangat sukses , dimaksudkan sebagai penggantinya, serupa dalam konsep tetapi dirancang ulang. Didefinisikan oleh JSR 310 . Diperpanjang oleh proyek ThreeTen-Extra . Lihat Tutorialnya .
Saat
The Instant
kelas merupakan saat di timeline di UTC dengan resolusi nanodetik (hingga sembilan (9) angka dari pecahan desimal).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Terbaik untuk menghindari kelas warisan seperti Date
/ Calendar
. Tetapi jika Anda harus beroperasi dengan kode lama yang belum diperbarui ke java.time , konversi bolak-balik. Panggil metode konversi baru yang ditambahkan ke kelas lama. Untuk berpindah dari a java.util.Date
ke Instant
, panggilan Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Rentang waktu
Kelas java.time telah membagi ide ini mewakili rentang waktu sebagai beberapa tahun, bulan, hari, jam, menit, detik menjadi dua bagian:
Period
selama bertahun-tahun, berbulan-bulan, berhari-hari
Duration
selama berhari-hari, berjam-jam, menit, detik
Berikut ini sebuah contoh.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Dump ke konsol.
Keduanya Period
dan Duration
menggunakan standar ISO 8601 untuk menghasilkan representasi String dari nilainya.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
sekarang: 2015-11-26T00: 46: 48.016-05: 00 [Amerika / Montreal] ke masa depan: 2015-11-26T00: 46: 48.016-05: 00 [America / Montreal] = PT1H3M
Java 9 menambahkan metode untuk Duration
mendapatkan bagian hari, bagian jam, bagian menit, dan bagian detik.
Anda bisa mendapatkan jumlah total hari atau jam atau menit atau detik atau milidetik atau nanodetik dalam seluruh Durasi.
long totalHours = duration.toHours();
Di Jawa 9 Duration
kelas mendapatkan metode baru untuk mengembalikan berbagai bagian hari, jam, menit, detik, milidetik / nanodetik. Memanggil to…Part
metode: toDaysPart()
, toHoursPart()
, dan sebagainya.
ChronoUnit
Jika Anda hanya peduli dengan rincian waktu yang lebih sederhana, seperti “jumlah hari yang berlalu”, gunakan ChronoUnit
enum.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Contoh lain.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date
, Calendar
, & SimpleDateFormat
.
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke java.time.
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .
Di mana mendapatkan kelas java.time?
- Java SE 8 dan SE 9 dan yang lebih baru
- Built-in
- Bagian dari API Java standar dengan implementasi yang dibundel.
- Java 9 menambahkan beberapa fitur dan perbaikan kecil.
- Java SE 6 dan SE 7
- Android
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval
, YearWeek
, YearQuarter
, dan lebih .
Joda-Time
UPDATE: Proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time . Saya membiarkan bagian ini utuh untuk sejarah.
Perpustakaan Joda-Time menggunakan ISO 8601 untuk standarnya. Its Period
mem-parsing kelas dan menghasilkan PnYnMnDTnHnMnS ini string.
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
Memberikan:
period: PT4H30M