核心转换方法
java.sql.Timestamp 类是 java.util.Date 类的子类,这意味着 Timestamp 对象可以直接赋值给 Date 引用变量,这种转换是向上转型(Upcasting),是 Java 语言本身支持的,非常简单。

直接赋值(最简单、最常用)
这是最直接的方法,利用了 Java 的继承关系。
import java.sql.Timestamp;
import java.util.Date;
public class TimestampToDateExample {
public static void main(String[] args) {
// 1. 创建一个 Timestamp 对象
// 使用当前时间
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
System.out.println("原始 Timestamp: " + timestamp);
// 2. 将 Timestamp 转换为 Date
// 因为 Timestamp 是 Date 的子类,所以可以直接赋值
Date date = timestamp;
// 3. 输出转换后的 Date
System.out.println("转换后的 Date: " + date);
}
}
输出结果:
原始 Timestamp: 2025-10-27T10:30:00.123456789Z
转换后的 Date: Fri Oct 27 10:30:00 CST 2025
注意事项:
- 这种转换会丢失
Timestamp特有的纳秒精度信息。Date类只精确到毫秒,而Timestamp可以精确到纳秒。 Date的toString()方法显示的格式可能与Timestamp不同,但它们代表的是同一个时间点。
不同场景下的最佳实践
在实际开发中,你可能会遇到不同的情况,比如从数据库获取时间戳、处理字符串时间等。

从数据库获取 TIMESTAMP 字段
当你使用 JDBC 从数据库(如 MySQL, PostgreSQL)中查询一个 TIMESTAMP 类型的列时,JDBC 驱动通常会将其映射为 java.sql.Timestamp 对象,然后你可能需要将其转换为 java.util.Date 以便在业务逻辑中使用。
import java.sql.*;
import java.util.Date;
public class JdbcTimestampToDate {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database";
String user = "username";
String password = "password";
String sql = "SELECT created_at FROM your_table WHERE id = 1";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
// 从结果集中获取 Timestamp 对象
Timestamp timestampFromDb = rs.getTimestamp("created_at");
System.out.println("从数据库获取的 Timestamp: " + timestampFromDb);
// 转换为 Date
Date dateFromDb = timestampFromDb;
System.out.println("转换后的 Date: " + dateFromDb);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
处理字符串时间
如果你有一个代表时间的字符串,需要先将其解析为 Timestamp,然后再转换为 Date,可以使用 java.text.SimpleDateFormat。
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public StringToDateExample {
public static void main(String[] args) {
String dateString = "2025-10-27 10:30:00.123";
// 1. 定义日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {
// 2. 将字符串解析为 Date 对象
Date parsedDate = sdf.parse(dateString);
System.out.println("从字符串解析的 Date: " + parsedDate);
// 3. 将 Date 转换为 Timestamp (可选步骤)
// 如果你的业务需要 Timestamp 的纳秒精度,可以这样做
Timestamp timestamp = new Timestamp(parsedDate.getTime());
System.out.println("转换后的 Timestamp: " + timestamp);
// 4. 再将 Timestamp 转换为 Date (回到最初的问题)
Date finalDate = timestamp;
System.out.println("最终转换的 Date: " + finalDate);
} catch (ParseException e) {
System.err.println("日期解析失败: " + e.getMessage());
}
}
}
现代 Java 8+ 的最佳实践:java.time
如果你使用的是 Java 8 或更高版本,强烈推荐使用 java.time 包中的类,它们是 java.util.Date 和 java.sql.Date/Timestamp 的现代化替代品,更安全、更易用。
java.time.Instant 可以看作是 java.util.Date 的现代等价物,它精确到纳秒。java.sql.Timestamp 也可以方便地与 Instant 互相转换。

Timestamp 转 Instant
import java.sql.Timestamp;
import java.time.Instant;
public class TimestampToInstant {
public static void main(String[] args) {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
System.out.println("原始 Timestamp: " + timestamp);
// Timestamp -> Instant
Instant instant = timestamp.toInstant();
System.out.println("转换后的 Instant: " + instant);
}
}
Instant 转 Timestamp
import java.sql.Timestamp;
import java.time.Instant;
public class InstantToTimestamp {
public static void main(String[] args) {
Instant instant = Instant.now();
System.out.println("原始 Instant: " + instant);
// Instant -> Timestamp
Timestamp timestamp = Timestamp.from(instant);
System.out.println("转换后的 Timestamp: " + timestamp);
}
}
总结与对比
| 方法 | 描述 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
Date date = timestamp; |
向上转型,直接赋值。 | 最简单,性能最好。 | 丢失纳秒精度。 | 当你只需要毫秒级精度,且不关心 Timestamp 特有方法时。 |
new Date(timestamp.getTime()) |
构造一个新的 Date 对象。 |
显式,意图明确。 | 同样丢失纳秒精度,且比直接赋值多了一次对象创建。 | 代码风格偏好,或者需要一个新的 Date 实例时。 |
timestamp.toInstant() |
(Java 8+) 转换为 Instant。 |
保留纳秒精度,API 更现代,线程安全。 | 需要学习新的 java.time API。 |
强烈推荐,所有新的 Java 项目都应使用 java.time。 |
Timestamp.from(instant) |
(Java 8+) 从 Instant 创建 Timestamp。 |
保留纳秒精度,API 现代化。 | 同上。 | 当你需要将 Instant 转换回 Timestamp(存入数据库)时。 |
最终建议:
- 如果仍在使用 Java 7 或更早版本:采用
Date date = timestamp;这种最直接的方式。 - 如果使用 Java 8 或更高版本:请优先使用
java.time.Instant,它更精确、更强大,并且是 Java 日期时间 API 的未来,只在需要与旧版 JDBC 或遗留代码交互时,才进行Timestamp和Instant之间的转换。
