Tambahkan Jam ke Tanggal di Jawa

1. Ikhtisar

Sebelum Java 8, java.util.Date adalah salah satu kelas yang paling umum digunakan untuk mewakili nilai tanggal-waktu di Java.

Kemudian Java 8 memperkenalkan java.time.LocalDateTime dan java.time.ZonedDateTime. Java 8 juga memungkinkan kita untuk merepresentasikan waktu tertentu di timeline menggunakan java.time.Instant.

Dalam tutorial ini, kita akan belajar menambah atau mengurangi n jam dari tanggal-waktu tertentu di Java . Pertama-tama kami akan melihat beberapa kelas terkait waktu-tanggal Java standar, dan kemudian kami akan menampilkan beberapa opsi pihak ketiga.

Untuk mempelajari lebih lanjut tentang Java 8 DateTime API, kami sarankan untuk membaca artikel ini.

2. java.util.Date

Jika kita menggunakan Java 7 atau lebih rendah, kita dapat menggunakan kelas java.util.Date dan java.util.Calendar untuk sebagian besar penanganan terkait tanggal-waktu.

Mari kita lihat bagaimana menambahkan n jam ke objek Tanggal tertentu :

public Date addHoursToJavaUtilDate(Date date, int hours) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.HOUR_OF_DAY, hours); return calendar.getTime(); }

Perhatikan bahwa Calendar.HOUR_OF_DAY mengacu pada format 24 jam .

Metode di atas mengembalikan objek Tanggal baru , yang nilainya bisa (tanggal + jam) atau (tanggal - jam) , bergantung pada apakah kita meneruskan nilai jam positif atau negatif masing-masing.

Misalkan kita memiliki aplikasi Java 8, tetapi kita masih ingin bekerja dengan contoh java.util.Date .

Untuk kasus seperti itu, kami dapat memilih untuk mengambil pendekatan alternatif berikut:

  1. Gunakan metode java.util.Date toInstant () untuk mengonversi objek Date menjadi instance java.time.Instant
  2. Tambahkan tertentu Duration ke java.time.Instant objek menggunakan () ditambah metode
  3. Recover kami java.util.Date misalnya dengan melewatkan di java.time.Instant objek ke java.util.Date.from () metode

Mari kita lihat sekilas pendekatan ini:

@Test public void givenJavaUtilDate_whenUsingToInstant_thenAddHours() { Date actualDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 5, 0) .getTime(); Date expectedDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 7, 0) .getTime(); assertThat(Date.from(actualDate.toInstant().plus(Duration.ofHours(2)))) .isEqualTo(expectedDate); }

Namun, perhatikan bahwa selalu disarankan untuk menggunakan API DateTime baru untuk semua aplikasi di Java 8 atau versi yang lebih tinggi.

3. java.time.LocalDateTime / ZonedDateTime

Di Java 8 atau yang lebih baru, menambahkan jam ke instance java.time.LocalDateTime atau java.time.ZonedDateTime cukup mudah dan menggunakan metode plusHours () :

@Test public void givenLocalDateTime_whenUsingPlusHours_thenAddHours() { LocalDateTime actualDateTime = LocalDateTime .of(2018, Month.JUNE, 25, 5, 0); LocalDateTime expectedDateTime = LocalDateTime. of(2018, Month.JUNE, 25, 10, 0); assertThat(actualDateTime.plusHours(5)).isEqualTo(expectedDateTime); }

Bagaimana jika kita ingin mengurangi beberapa jam?

Meneruskan nilai jam negatif ke metode plusHours () akan baik-baik saja. Namun, disarankan untuk menggunakan metode minusHours () :

@Test public void givenLocalDateTime_whenUsingMinusHours_thenSubtractHours() { LocalDateTime actualDateTime = LocalDateTime .of(2018, Month.JUNE, 25, 5, 0); LocalDateTime expectedDateTime = LocalDateTime .of(2018, Month.JUNE, 25, 3, 0); assertThat(actualDateTime.minusHours(2)).isEqualTo(expectedDateTime); }

Metode plusHours () dan minusHours () di java.time.ZonedDateTime bekerja dengan cara yang persis sama.

4. java.time.Instant

Seperti yang kita ketahui, java.time.Instant yang diperkenalkan di Java 8 DateTime API mewakili momen tertentu di timeline.

Untuk menambahkan beberapa jam ke objek Instan , kita dapat menggunakan metode plus () dengan java.time.temporal.TemporalAmount :

@Test public void givenInstant_whenUsingAddHoursToInstant_thenAddHours() { Instant actualValue = Instant.parse("2018-06-25T05:12:35Z"); Instant expectedValue = Instant.parse("2018-06-25T07:12:35Z"); assertThat(actualValue.plus(2, ChronoUnit.HOURS)) .isEqualTo(expectedValue); }

Demikian pula, metode minus () dapat digunakan untuk mengurangi TemporalAmount tertentu .

5. TanggalUtils Apache Commons

Kelas DateUtils dari pustaka Apache Commons Lang memperlihatkan metode addHours () statis :

public static Date addHours(Date date, int amount)

Metode ini mengambil objek java.util.Date bersama dengan jumlah yang ingin kita tambahkan, nilainya bisa positif atau negatif.

Objek java.util.Date baru dikembalikan sebagai hasil:

@Test public void givenJavaUtilDate_whenUsingApacheCommons_thenAddHours() { Date actualDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 5, 0) .getTime(); Date expectedDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 7, 0) .getTime(); assertThat(DateUtils.addHours(actualDate, 2)).isEqualTo(expectedDate); }

Versi terbaru Apache Commons Lang tersedia di Maven Central.

6. Waktu Joda

Joda Time adalah alternatif dari Java 8 DateTime API dan menyediakan implementasi DateTime sendiri .

Sebagian besar kelas terkait DateTime mengekspos metode plusHours () dan minusHours () untuk membantu kita menambah atau mengurangi jumlah jam tertentu dari objek DateTime .

Mari kita lihat contohnya:

@Test public void givenJodaDateTime_whenUsingPlusHoursToDateTime_thenAddHours() { DateTime actualDateTime = new DateTime(2018, 5, 25, 5, 0); DateTime expectedDateTime = new DateTime(2018, 5, 25, 7, 0); assertThat(actualDateTime.plusHours(2)).isEqualTo(expectedDateTime); }

Kami dapat dengan mudah memeriksa versi Joda Time terbaru yang tersedia di Maven Central.

7. Kesimpulan

Dalam tutorial ini, kami membahas beberapa cara untuk menambah atau mengurangi jumlah jam tertentu dari nilai waktu-tanggal Java standar.

Kami juga melihat beberapa perpustakaan pihak ketiga sebagai alternatif. Seperti biasa, kode sumber lengkap tersedia di GitHub.