java.util.Date vs java.sql.Date

1. Ikhtisar

Dalam tutorial ini, kita akan membandingkan dua kelas tanggal: java.util.Date dan java.sql.Date .

Setelah kami menyelesaikan perbandingan, harus jelas mana yang digunakan dan mengapa.

2. java.util.Date

Kelas java.util.Date mewakili momen tertentu dalam waktu, dengan presisi milidetik sejak 1 Januari 1970 00:00:00 GMT (waktu epoch) . Kelas digunakan untuk menjaga waktu universal terkoordinasi (UTC).

Kita bisa memulainya dengan dua cara.

Dengan memanggil konstruktor:

Date date = new Date();

yang akan membuat objek tanggal baru dengan waktu yang disetel ke waktu saat ini, diukur ke milidetik terdekat.

Atau dengan melewatkan beberapa milidetik sejak periode:

long timestamp = 1532516399000; // 25 July 2018 10:59:59 UTC Date date = new Date(timestamp);

Perhatikan bahwa konstruktor lain, yang ada sebelum Java 8, sekarang sudah tidak digunakan lagi.

Namun, Tanggal memiliki sejumlah masalah dan secara keseluruhan penggunaannya tidak direkomendasikan lagi .

Itu bisa berubah. Setelah kami menginisialisasi, kami dapat mengubah nilai internalnya. Misalnya, kita dapat memanggil metode setTime :

date.setTime(0); // 01 January 1970 00:00:00

Untuk mempelajari lebih lanjut tentang keuntungan objek yang tidak dapat diubah, lihat artikel ini: Objek yang Tidak Dapat Diubah di Java.

Itu juga tidak menangani semua tanggal dengan baik. Secara teknis, ini harus mencerminkan waktu universal terkoordinasi (UTC). Namun, itu tergantung pada sistem operasi lingkungan host.

Kebanyakan sistem operasi modern menggunakan 1 hari = 24j x 60m x 60s = 86400 detik, yang seperti yang dapat kita lihat, tidak memperhitungkan "leap second".

Dengan diperkenalkannya Java 8, paket java.time harus digunakan . Sebelum Java 8, solusi alternatif tersedia - Joda Time .

3. java.sql.Date

The java.sql.Date meluas java.util.Date kelas.

Tujuan utamanya adalah untuk merepresentasikan SQL DATE, yang menyimpan tahun, bulan, dan hari. Tidak ada data waktu disimpan.

Faktanya, tanggal disimpan sebagai milidetik sejak 1 Januari 1970 00:00:00 GMT dan bagian waktu dinormalisasi, yaitu disetel ke nol.

Pada dasarnya, ini adalah pembungkus java.util.Date yang menangani persyaratan khusus SQL. java.sql.Date harus digunakan hanya saat menangani database.

Namun, karena java.sql.Date tidak menyimpan informasi zona waktu, konversi zona waktu antara lingkungan lokal dan server database kita bergantung pada implementasi driver JDBC. Ini menambah tingkat kerumitan lainnya.

Terakhir, perhatikan, untuk mendukung tipe data SQL lainnya: SQL TIME dan SQL TIMESTAMP, tersedia dua kelas java.sql lainnya : Time dan Timestamp .

Yang terakhir, meskipun diperluas dari java.util.Date , mendukung nanodetik.

4. Kesimpulan

Kelas java.util.Date menyimpan nilai tanggal-waktu sebagai milidetik sejak epoch. java.sql.Date menyimpan nilai hanya tanggal dan biasanya digunakan di JDBC.

Menangani tanggal itu rumit. Kita perlu mengingat tentang kasus-kasus khusus: detik kabisat, zona waktu yang berbeda, dll. Saat berurusan dengan JDBC, kita dapat menggunakan java.sql.Date dengan hati-hati.

Jika kita akan menggunakan java.util.Date, kita perlu mengingat kekurangannya. Jika menggunakan Java 8 maka lebih baik tidak menggunakan java.util.Date sama sekali.