java.util.Date vs java.sql.Date

1. Gambaran keseluruhan

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

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

2. java.util.Tarikh

The java.util.Date kelas mewakili masa tertentu dalam masa, dengan ketepatan milisaat sejak 1 Jan 1970 00:00:00 GMT (masa zaman) . Kelas digunakan untuk memastikan masa sejagat terkoordinasi (UTC).

Kita boleh memulakannya dengan dua cara.

Dengan memanggil pembina:

Date date = new Date();

yang akan membuat objek tarikh baru dengan waktu yang ditetapkan untuk waktu semasa, diukur ke milisaat terdekat.

Atau dengan melewati beberapa milisaat sejak zaman:

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

Mari kita perhatikan bahawa pembangun lain, yang ada sebelum Java 8, tidak lagi digunakan sekarang.

Namun, Date mempunyai sejumlah masalah dan secara keseluruhan penggunaannya tidak digalakkan lagi .

Ia boleh berubah. Sebaik sahaja kita memulakannya, kita dapat mengubah nilai dalamannya. Sebagai contoh, kita boleh memanggil kaedah setTime :

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

Untuk mengetahui lebih lanjut mengenai kelebihan objek yang tidak berubah, lihat artikel ini: Objek yang Tidak Berubah di Jawa.

Ia juga tidak dapat menangani semua tarikh dengan baik. Secara teknikal, ia harus menggambarkan masa sejagat yang terkoordinasi (UTC). Namun, itu bergantung pada sistem operasi persekitaran host.

Sebilangan besar sistem operasi moden menggunakan 1 hari = 24j x 60m x 60s = 86400 saat, yang seperti yang kita lihat, tidak mengambil kira "lompatan kedua".

Dengan pengenalan Java 8, pakej java.time harus digunakan . Sebelum Java 8, penyelesaian alternatif boleh didapati - Joda Masa .

3. java.sql.Tarikh

Tarikh java.sql meluas kelas java.util.Date .

Tujuan utamanya adalah untuk mewakili SQL DATE, yang menyimpan tahun, bulan dan hari. Tiada data masa disimpan.

Sebenarnya, tarikh disimpan sebagai milisaat sejak 1 Januari 1970 00:00:00 GMT dan bahagian waktu dinormalisasi, iaitu ditetapkan ke sifar.

Pada dasarnya, ia adalah pembungkus sekitar java.util.Date yang menangani keperluan khusus SQL. java.sql.Date harus digunakan hanya ketika berurusan dengan pangkalan data.

Namun, kerana java.sql.Date tidak menyimpan maklumat zon waktu, penukaran zon waktu antara persekitaran tempatan dan pelayan pangkalan data bergantung kepada pelaksanaan pemacu JDBC. Ini menambahkan lagi tahap kerumitan.

Akhirnya, mari kita perhatikan, untuk menyokong jenis data SQL yang lain: SQL TIME dan SQL TIMESTAMP, dua kelas java.sql yang lain tersedia: Waktu dan Cap Waktu .

Yang terakhir, walaupun berlanjutan dari java.util.Date , menyokong nanodetik.

4. Kesimpulan

Kelas java.util.Date menyimpan nilai tarikh-masa sebagai milisaat sejak zaman itu. java.sql.Date menyimpan nilai tarikh sahaja dan biasanya digunakan di JDBC.

Mengendalikan tarikh sukar. Kita perlu ingat mengenai kes khas: detik lompatan, zon waktu yang berbeza dan lain-lain. Semasa berurusan dengan JDBC, kita dapat menggunakan tarikh java.sql. Dengan berhati-hati.

Sekiranya kita akan menggunakan java.util.Date, kita perlu ingat tentang kekurangannya. Sekiranya menggunakan Java 8 maka lebih baik tidak menggunakan java.util.Date sama sekali.