Periode dan Durasi di Jawa

1. Ikhtisar

Dalam tutorial singkat ini, kita akan melihat dua kelas baru untuk bekerja dengan tanggal yang diperkenalkan di Java 8: Periode dan Durasi .

Kedua kelas dapat digunakan untuk mewakili jumlah waktu atau menentukan perbedaan antara dua tanggal. Perbedaan utama antara kedua kelas tersebut adalah Periode menggunakan nilai berbasis tanggal, sedangkan Durasi menggunakan nilai berbasis waktu.

2. Kelas Periode

Kelas Periode menggunakan unit tahun, bulan dan hari untuk mewakili periode waktu.

Kita bisa mendapatkan objek Periode sebagai perbedaan antara dua tanggal dengan menggunakan metode antara () :

LocalDate startDate = LocalDate.of(2015, 2, 20); LocalDate endDate = LocalDate.of(2017, 1, 15); Period period = Period.between(startDate, endDate);

Kemudian, kita dapat menentukan unit tanggal dari periode menggunakan metode getYears (), getMonths (), getDays () :

LOG.info("Years:" + period.getYears() + " months:" + period.getMonths() + " days:"+period.getDays());

Dalam kasus ini, metode isNegative () , yang mengembalikan nilai true jika ada unit yang negatif, dapat digunakan untuk menentukan apakah endDate lebih tinggi dari startDate :

assertFalse(period.isNegative());

Jika isNegative () mengembalikan false, maka startDate lebih awal dari nilai endDate .

Cara lain untuk membuat objek Periode didasarkan pada jumlah hari, bulan, minggu, atau tahun menggunakan metode khusus:

Period fromUnits = Period.of(3, 10, 10); Period fromDays = Period.ofDays(50); Period fromMonths = Period.ofMonths(5); Period fromYears = Period.ofYears(10); Period fromWeeks = Period.ofWeeks(40); assertEquals(280, fromWeeks.getDays());

Jika hanya ada satu nilai, misalnya dengan menggunakan metode ofDays () , maka nilai unit lainnya adalah 0.

Dalam kasus metode ofWeeks () , nilai parameter digunakan untuk mengatur jumlah hari dengan mengalikannya dengan 7.

Kita juga dapat membuat objek Periode dengan mengurai urutan teks , yang harus memiliki format "PnYnMnD":

Period fromCharYears = Period.parse("P2Y"); assertEquals(2, fromCharYears.getYears()); Period fromCharUnits = Period.parse("P2Y3M5D"); assertEquals(5, fromCharUnits.getDays());

Nilai periode bisa ditambah atau dikurangi dengan menggunakan metode bentuk plusX () dan minusX () , di mana X mewakili unit tanggal:

assertEquals(56, period.plusDays(50).getDays()); assertEquals(9, period.minusMonths(2).getMonths());

3. Kelas Durasi

Kelas Durasi mewakili interval waktu dalam detik atau nanodetik dan paling sesuai untuk menangani jumlah waktu yang lebih singkat, dalam kasus yang memerlukan lebih banyak presisi.

Kita bisa menentukan perbedaan antara dua instant sebagai objek Duration menggunakan metode antara () :

Instant start = Instant.parse("2017-10-03T10:15:30.00Z"); Instant end = Instant.parse("2017-10-03T10:16:30.00Z"); Duration duration = Duration.between(start, end);

Kemudian kita bisa menggunakan metode getSeconds () atau getNanoseconds () untuk menentukan nilai unit waktu:

assertEquals(60, duration.getSeconds());

Atau, kita bisa mendapatkan contoh Durasi dari dua contoh LocalDateTime:

LocalTime start = LocalTime.of(1, 20, 25, 1024); LocalTime end = LocalTime.of(3, 22, 27, 1544); Duration.between(start, end).getSeconds();

Metode isNegative () dapat digunakan untuk memverifikasi jika instan akhir lebih tinggi dari instan awal:

assertFalse(duration.isNegative());

Kita juga bisa mendapatkan objek Durasi berdasarkan beberapa unit waktu , menggunakan metodeDays (), ofHours (), ofMillis (), ofMinutes (), ofNanos (), ofSeconds () :

Duration fromDays = Duration.ofDays(1); assertEquals(86400, fromDays.getSeconds()); Duration fromMinutes = Duration.ofMinutes(60);

Untuk membuat objek Durasi berdasarkan urutan teks, ini harus dalam format "PnDTnHnMn.nS":

Duration fromChar1 = Duration.parse("P1DT1H10M10.5S"); Duration fromChar2 = Duration.parse("PT10M");

Durasi dapat dikonversi ke unit waktu lain menggunakan toDays (), toHours (), toMillis (), toMinutes () :

assertEquals(1, fromMinutes.toHours());

Nilai durasi dapat ditambah atau dikurangi dengan menggunakan metode bentuk plusX () atau minusX () , di mana X dapat berdiri untuk hari, jam, milidetik, menit, nanos atau detik:

assertEquals(120, duration.plusSeconds(60).getSeconds()); assertEquals(30, duration.minusSeconds(30).getSeconds());

Kita juga bisa menggunakan metode plus () dan minus () dengan parameter yang menentukan TemporalUnit untuk menambah atau mengurangi:

assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds()); assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());

4. Kesimpulan

Dalam tutorial ini, kami telah menunjukkan bagaimana kita dapat menggunakan kelas Periode dan Durasi .

Seperti biasa, kode sumber lengkap dari contoh dapat ditemukan di GitHub.