Tambahkan Waktu Ke Tarikh Di Jawa

1. Gambaran keseluruhan

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

Kemudian Java 8 memperkenalkan java.time.LocalDateTime dan java.time.ZonedDateTime. Java 8 juga memungkinkan kita untuk mewakili waktu tertentu pada garis masa menggunakan java.time.Instant.

Dalam tutorial ini, kita akan belajar menambah atau mengurangkan n jam dari tarikh-tarikh tertentu di Java . Mula-mula kita akan melihat beberapa kelas berkaitan tarikh-waktu Java standard, dan kemudian kita akan mempamerkan beberapa pilihan pihak ketiga.

Untuk mengetahui lebih lanjut mengenai Java 8 DateTime API, kami sarankan membaca artikel ini.

2. java.util.Tarikh

Sekiranya kita menggunakan Java 7 atau lebih rendah, kita dapat menggunakan kelas java.util.Date dan java.util.Calendar untuk kebanyakan pengendalian berkaitan tarikh-waktu.

Mari kita lihat cara menambah n jam pada objek Tarikh 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 bahawa Kalendar.HOUR_OF_DAY merujuk kepada jam 24 jam .

Kaedah di atas mengembalikan objek Tarikh baru , yang nilainya sama ada (tarikh + jam) atau (tarikh - jam) , bergantung pada sama ada kita melewati nilai jam positif atau negatif masing-masing.

Anggaplah kita mempunyai aplikasi Java 8, tetapi kita masih mahu bekerja dengan contoh java.util.Date .

Untuk kes seperti itu, kita dapat memilih untuk mengambil pendekatan alternatif berikut:

  1. Gunakan kaedah java.util.Date toInstant () untuk menukar objek Date ke java.time.Instant instance
  2. Tambah tertentu Tempoh kepada java.time.Instant objek menggunakan () serta kaedah
  3. Recover kami java.util.Date misalnya dengan lulus dalam java.time.Instant objek kepada java.util.Date.from () kaedah

Mari kita lihat dengan cepat 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 bahawa 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 lebih baru, menambahkan jam pada contoh java.time.LocalDateTime atau java.time.ZonedDateTime cukup mudah dan menggunakan kaedah 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 mahu mengurangkan beberapa jam?

Melewatkan nilai negatif jam ke kaedah plusHours () akan baik-baik saja. Walau bagaimanapun, disyorkan untuk menggunakan kaedah 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); }

Kaedah plusHours () dan minusHours () dalam java.time.ZonedDateTime berfungsi dengan cara yang sama.

4. java.time.Instant

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

Untuk menambah beberapa jam kepada Segera objek, kita boleh menggunakan yang ditambah () kaedah 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); }

Begitu juga, kaedah tolak () dapat digunakan untuk mengurangkan TemporalAmount tertentu .

5. Apache Commons DateUtils

The DateUtils kelas dari perpustakaan Apache Commons Lang mendedahkan yang statik addHours () kaedah:

public static Date addHours(Date date, int amount)

Kaedah mengambil objek java.util.Date bersama dengan jumlah yang ingin kita tambahkan padanya, nilainya boleh menjadi positif atau negatif.

Objek java.util.Date baru dikembalikan sebagai hasilnya:

@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 boleh didapati di Maven Central.

6. Masa Joda

Joda Time adalah alternatif untuk Java 8 DateTime API dan menyediakan pelaksanaan DateTime sendiri .

Sebilangan besar kelas berkaitan DateTime mendedahkan kaedah plusHours () dan minusHours () untuk membantu kami menambah atau mengurangkan jumlah jam tertentu dari objek DateTime .

Mari lihat contoh:

@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 terbaru Joda Time yang tersedia di Maven Central.

7. Kesimpulannya

Dalam tutorial ini, kami membahas beberapa cara untuk menambah atau mengurangkan sejumlah jam dari nilai tarikh-waktu Java standard.

Kami juga melihat beberapa perpustakaan pihak ketiga sebagai alternatif. Seperti biasa, kod sumber lengkap boleh didapati di GitHub.