Dapatkan Tarikh Tanpa Masa di Java

1. Pengenalan

Dalam tutorial ringkas ini, kami akan menunjukkan cara mendapatkan Tarikh tanpa masa di Java.

Kami akan menunjukkan cara melakukan ini sebelum dan sesudah Java 8 kerana semuanya menjadi sedikit berbeza setelah peluncuran API waktu baru di Java 8.

2. Sebelum Jawa 8

Sebelum Java 8, tidak ada cara langsung untuk mendapatkan Tarikh tanpa masa melainkan kita menggunakan perpustakaan pihak ketiga seperti Joda-time.

Ini kerana yang Tarikh kelas di Jawa adalah perwakilan yang segera tertentu dalam masa, dinyatakan dalam milisaat . Oleh itu, ini menjadikan mustahil untuk mengabaikan waktu pada Tarikh .

Pada bahagian seterusnya, kami akan menunjukkan beberapa penyelesaian biasa untuk mengatasi masalah ini.

2.1. Menggunakan Kalendar

Salah satu cara yang paling biasa untuk mendapatkan Tarikh tanpa masa adalah dengan menggunakan kelas Kalendar untuk menetapkan waktu ke sifar . Dengan melakukan ini kita mendapat tarikh yang bersih, dengan waktu yang ditetapkan pada awal hari.

Mari kita lihat dalam kod:

public static Date getDateWithoutTimeUsingCalendar() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); }

Sekiranya kita memanggil kaedah ini, kita akan mendapat tarikh seperti ini:

Sat Jun 23 00:00:00 CEST 2018

Seperti yang dapat kita lihat, ia mengembalikan tarikh penuh dengan waktu yang ditetapkan menjadi sifar, tetapi kita tidak boleh mengabaikan waktunya .

Juga, untuk memastikan bahawa tidak ada waktu yang ditetapkan dalam Tarikh dikembalikan, kami dapat membuat ujian berikut:

@Test public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime() { Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar(); Calendar calendar = Calendar.getInstance(); calendar.setTime(dateWithoutTime); int day = calendar.get(Calendar.DAY_OF_MONTH); calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY - 1); assertEquals(day, calendar.get(Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY); assertNotEquals(day, calendar.get(Calendar.DAY_OF_MONTH)); }

Seperti yang kita lihat, apabila kita menambah tarikh milisaat sehari tolak satu hari kita masih mendapat hari yang sama, tetapi apabila kita menambah hari penuh, kita akan mendapat hari berikutnya.

2.2. Menggunakan Formatter

Cara lain untuk melakukannya adalah dengan memformat Tarikh menjadi Rentetan tanpa masa dan kemudian menukar String itu kembali ke Tarikh . Oleh kerana String diformat tanpa waktu, Date yang ditukar akan mempunyai waktu yang ditetapkan ke sifar.

Mari kita laksanakan untuk melihat bagaimana ia berfungsi:

public static Date getDateWithoutTimeUsingFormat() throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat( "dd/MM/yyyy"); return formatter.parse(formatter.format(new Date())); }

Pelaksanaan ini kembali sama seperti kaedah yang ditunjukkan pada bahagian sebelumnya:

Sat Jun 23 00:00:00 CEST 2018

Sekali lagi, kita boleh menggunakan ujian seperti yang kita lakukan sebelumnya untuk memastikan tidak ada masa dalam Tarikh dikembalikan.

3. Menggunakan Java 8

Dengan pelepasan API waktu baru di Java 8, ada cara yang lebih mudah untuk mendapatkan tarikh tanpa waktunya. Salah satu ciri baru yang dibawa oleh API baru ini ialah terdapat beberapa kelas untuk bekerja dengan tarikh dengan atau tanpa masa, atau bahkan hanya berfungsi dengan masa.

Untuk artikel ini, kita akan memfokuskan pada kelas LocalDate , yang mewakili apa yang kita perlukan, tarikh tanpa masa.

Mari kita lihat dengan contoh ini:

public static LocalDate getLocalDate() { return LocalDate.now(); }

Kaedah ini mengembalikan objek LocalDate dengan perwakilan tarikh ini:

2018-06-23

Seperti yang dapat kita lihat, ia kembali hanya tarikh, waktunya tidak diendahkan .

Sekali lagi, mari kita mengujinya seperti sebelumnya untuk memastikan kaedah ini berfungsi seperti yang diharapkan:

@Test public void whenGettingLocalDate_thenReturnDateWithoutTime() { LocalDate localDate = DateWithoutTime.getLocalDate(); long millisLocalDate = localDate .atStartOfDay() .toInstant(OffsetDateTime .now() .getOffset()) .toEpochMilli(); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis( millisLocalDate + MILLISECONDS_PER_DAY - 1); assertEquals( localDate.getDayOfMonth(), calendar.get(Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis(millisLocalDate + MILLISECONDS_PER_DAY); assertNotEquals( localDate.getDayOfMonth(), calendar.get(Calendar.DAY_OF_MONTH)); }

4. Kesimpulan

Dalam artikel ini, kami telah menunjukkan cara mendapatkan Tarikh tanpa masa di Java. Kami pertama kali menunjukkan cara melakukannya sebelum Java 8 dan juga menggunakan Java 8.

Seperti yang dapat kita lihat dalam contoh yang diterapkan dalam artikel, menggunakan Java 8 harus selalu menjadi pilihan yang disukai , karena memiliki representasi khusus untuk bekerja dengan tarikh tanpa waktu.

Seperti biasa, kod sumber penuh contoh terdapat di GitHub.