java.sql.Date 是 Java 标准库中用于处理数据库日期的类,用于 JDBC API 中,位于 java.sql 包下,主要用于与数据库交互时表示日期类型(不包含时间信息)。如果你需要在 java.sql.PreparedStatement 上设置日期,或者从 java.sql.ResultSet 中获取日期,你将会用到 java.sql.Date。
注意:java.sql.Date 继承自 java.util.Date,但对时间部分做了特殊处理。如下图:
以下是实例化一个 java.sql.Date 的方法:
import java.sql.Date; public class SqlDateExample { public static void main(String[] args) { // 1. 通过毫秒数创建 long currentTimeMillis = System.currentTimeMillis(); Date sqlDate1 = new Date(currentTimeMillis); System.out.println("通过毫秒数创建: " + sqlDate1); // 格式: yyyy-mm-dd // 2. 通过字符串创建 Date sqlDate2 = Date.valueOf("2023-10-05"); System.out.println("通过字符串创建: " + sqlDate2); // 3. 转换为毫秒数 long time = sqlDate2.getTime(); System.out.println("对应的毫秒数: " + time); } }
运行结果:
通过毫秒数创建: 2025-09-04 通过字符串创建: 2023-10-05 对应的毫秒数: 1696435200000
java.sql.Date 的常用方法如下:
valueOf(String s):将符合 yyyy-[m]m-[d]d 格式的字符串转换为 java.sql.Date 对象。
toString():返回 yyyy-mm-dd 格式的字符串。
继承自 java.util.Date 的方法(如 getTime()、setTime() 等)。
示例:
import java.sql.Date; public class SqlDateMethodsExample { public static void main(String[] args) { // 1. 使用 valueOf() 方法:将字符串转换为 java.sql.Date // 字符串格式必须为 yyyy-mm-dd(月份和日期可为1位或2位) Date date1 = Date.valueOf("2024-5-1"); // 5月1日 Date date2 = Date.valueOf("2024-10-08"); // 10月8日 System.out.println("通过 valueOf() 创建的日期1: " + date1); System.out.println("通过 valueOf() 创建的日期2: " + date2); // 2. 使用 toString() 方法:返回 yyyy-mm-dd 格式的字符串 String dateStr = date2.toString(); System.out.println("date2 转换为字符串: " + dateStr); // 3. 继承自 java.util.Date 的方法 // getTime():获取自1970-01-01 00:00:00 GMT以来的毫秒数 long timeMillis = date1.getTime(); System.out.println("date1 对应的毫秒数: " + timeMillis); // setTime():通过毫秒数设置日期 Date date3 = new Date(0); // 初始化为1970-01-01 System.out.println("初始化 date3: " + date3); date3.setTime(timeMillis); // 设置为与 date1 相同的日期 System.out.println("setTime() 后 date3: " + date3); } }
运行结果:
通过 valueOf() 创建的日期1: 2024-05-01 通过 valueOf() 创建的日期2: 2024-10-08 date2 转换为字符串: 2024-10-08 date1 对应的毫秒数: 1714492800000 初始化 date3: 1970-01-01 setTime() 后 date3: 2024-05-01
java.sql.Date 和 java.util.Date 之间最大的区别在于,java.sql.Date 只保留它所表示的日期中的日期部分,而不保留时间部分。例如,如果你使用 2009年12月24日23:20 这个日期和时间创建一个java.sql.Date,那么时间部分(23:20)会被截断。如果你需要保留时间,那就改用 java.sql.Timestamp。
示例:
public class SqlDateExample2 { public static void main(String[] args) { long current = System.currentTimeMillis(); java.sql.Date sqlDate = new java.sql.Date(current); System.out.println("java.sql.Date: " + sqlDate); java.util.Date utilDate = new java.util.Date(current); System.out.println("java.util.Date: " + utilDate); } }
运行结果:
java.sql.Date: 2025-09-04 java.util.Date: Thu Sep 04 22:55:29 CST 2025
与 java.util.Date 的区别:java.util.Date 包含日期和时间,而 java.sql.Date 仅关注日期,时间部分会被截断。
与数据库交互时,PreparedStatement 的 setDate() 方法通常接受 java.sql.Date 类型。
在 Java 8+ 中,推荐使用新的日期时间 API(java.time 包下的 LocalDate 等),并通过 java.sql.Date.valueOf(LocalDate) 进行转换。如下:
import java.sql.Date; import java.time.LocalDate; public class SqlDateConversion { public static void main(String[] args) { // LocalDate 转 java.sql.Date LocalDate localDate = LocalDate.now(); Date sqlDate = Date.valueOf(localDate); System.out.println(sqlDate); // 2025-09-04 // java.sql.Date 转 LocalDate LocalDate convertedLocalDate = sqlDate.toLocalDate(); System.out.println(convertedLocalDate); // 2025-09-04 } }
运行结果:
2025-09-04 2025-09-04