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