Trong Java, có 2 class có tên giống nhau hoàn toàn là java.util.Date và java.sql.Date. Nhiều khi chúng ta có thể nhầm lẫn giữa 2 class này khi sử dụng.
Đặc biệt là khi thao tác trong JDBC, nếu sử dụng đúng java.sql.Date thì chúng ta sẽ có một số hàm tiện lợi để thao tác chẳng hạn như toLocalDate() để chuyển đổi từ java.sql.Date sang LocalDate, hay valueOf(LocalDate) để chuyển đổi từ LocalDate sang java.sql.Date.
Trong bài viết này chúng ta sẽ cùng so sánh giữa 2 class và tìm ra các trường hợp nào nên sử dụng chúng.
java.util.Date
Class java.util.Date đại diện cho một thời điểm cụ thể, với độ chính xác đến mili giây kể từ ngày 1 tháng 1 năm 1970 00:00:00 GMT.
Chúng ta có thể khởi tạo java.util.Date thông qua
Date date = new Date();
Với đoạn mã trên chúng ta sẽ tạo ra một Date object đại diện cho thời gian tại thời điểm khởi tạo object đến từng mili giây.
Ngoài ra chúng ta có thể khởi tạo Date thông qua số mili giây cụ thể
long timestamp = 1532516399000; // 25 July 2018 10:59:59 UTC Date date = new Date(timestamp);
Tuy nhiên java.util.Date tồn tại một số vấn đề và thực tế thì nó không còn được khuyến khích sử dụng trong các phiên bản Java mới hiện nay.
java.util.Date là mutable, có nghĩa là chúng ta có thể thay đổi giá trị sau khi khởi tạo.
date.setTime(0); // 01 January 1970 00:00:00
Ngoài ra nó cũng không thể xử lý tốt về dữ liệu thời gian. Về mặt kỹ thuật, nó xử lý dựa trên universal time (UTC). Tuy nhiên, nó lại phụ thuộc vào hệ điều hành trên máy đang chạy ứng dụng.
Hầu hết các hệ điều hành hiện đại sử dụng 1 ngày = 24h x 60m x 60s = 86400 giây, như chúng ta có thể thấy java.util.Date sẽ không làm mất “giây nhuận” để tích lũy.
Với sự ra đời của Java 8, gói java.time nên được sử dụng. Trước Java 8, một giải pháp thay thế đã có sẵn – Joda Time.
java.sql.Date
Class java.sql.Date thừa kế từ java.util.Date, nó được dùng để đại diện cho kiểu dữ liệu Date trong SQL. java.sql.Date chỉ lưu trữ ngày, tháng và năm, bỏ qua dữ liệu thời gian như giờ, phút, giây như java.util.Date.
Trên thực tế, dữ liệu được lưu trữ trong java.sql.Date dưới dạng mili giây kể từ ngày 1 tháng 1 năm 1970 00:00:00 GMT và phần thời gian được chuẩn hóa, tức là được đặt thành 0.
Về cơ bản, nó là wrapper class của java.util.Date để xử lý các nhu cầu cụ thể trong SQL. Chúng ta chỉ nên sử dụng java.sql.Date khi thao tác với database chẳng hạn như trong JDBC cũng sử dụng java.sql.Date để xử lý dữ liệu dạng Date.
Nguồn
https://www.baeldung.com/java-util-date-sql-date