在 Java 中获取 Timestamp 通常涉及以下几个核心场景和对应的方法。Timestamp 是 java.sql 包下的一个类,用于表示 SQL TIMESTAMP 类型,它继承自 java.util.Date,但增加了对纳秒(nanoseconds)的支持。

下面我将分步详细讲解如何获取 Timestamp,并提供不同场景下的代码示例。
核心方法:Timestamp.from(Instant)
这是在 Java 8 及更高版本中获取 Timestamp 的推荐和最标准的方法。java.sql.Timestamp 和 java.time.Instant 之间有一个明确的转换关系。
Instant 类代表时间线上的一个精确点,从 Unix 纪元(1970-01-01T00:00:00Z)开始计算,精度为纳秒。Timestamp 本质上也是存储了从 Unix 纪元开始的毫秒和纳秒数。
示例:获取当前时间的 Timestamp
这是最常见的需求。

import java.sql.Timestamp;
import java.time.Instant;
public class GetCurrentTimestamp {
public static void main(String[] args) {
// 1. 获取当前的 Instant 对象
Instant now = Instant.now();
// 2. 将 Instant 转换为 Timestamp
Timestamp currentTimestamp = Timestamp.from(now);
System.out.println("当前时间的 Timestamp: " + currentTimestamp);
System.out.println("时间戳值 (毫秒): " + currentTimestamp.getTime());
}
}
输出可能如下:
当前时间的 Timestamp: 2025-10-27T10:30:00.123456789
时间戳值 (毫秒): 1698371400123
其他获取方式(根据不同需求)
从 java.util.Date 转换
如果你有一个旧的 java.util.Date 对象,可以很容易地将其转换为 Timestamp。
import java.sql.Timestamp;
import java.util.Date;
public class FromDateToTimestamp {
public static void main(String[] args) {
// 获取当前的 Date 对象
Date currentDate = new Date();
// 直接将 Date 对象传递给 Timestamp 的构造函数
// Timestamp 的构造函数会自动处理 Date 中的毫秒数
Timestamp timestampFromDate = new Timestamp(currentDate.getTime());
System.out.println("从 Date 转换的 Timestamp: " + timestampFromDate);
}
}
注意:虽然 Timestamp 继承自 Date,但在新代码中应尽量避免直接使用 Date,优先使用 java.time 包下的类。
从 LocalDateTime 转换
LocalDateTime 是 java.time 包下的一个类,表示不带时区的日期和时间,如果你有一个 LocalDateTime 对象,可以先将其转换为 Instant,然后再得到 Timestamp。
import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
public class FromLocalDateTimeToTimestamp {
public static void main(String[] args) {
// 获取当前的 LocalDateTime (使用系统默认时区)
LocalDateTime now = LocalDateTime.now();
// 将 LocalDateTime 转换为 Instant
// 必须指定一个时区,因为 Instant 是 UTC 时间
Instant instant = now.atZone(ZoneId.systemDefault()).toInstant();
// 将 Instant 转换为 Timestamp
Timestamp timestampFromLocalDateTime = Timestamp.from(instant);
System.out.println("从 LocalDateTime 转换的 Timestamp: " + timestampFromLocalDateTime);
}
}
从 String 解析
如果你有一个表示日期时间的字符串,可以先用 java.time 的解析器将其解析为 LocalDateTime 或 Instant,然后再转换为 Timestamp。
import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class FromStringToTimestamp {
public static void main(String[] args) {
String dateTimeString = "2025-10-27 15:45:30.123";
// 定义日期时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
// 1. 解析为 LocalDateTime
LocalDateTime localDateTime = LocalDateTime.parse(dateTimeString, formatter);
// 2. 转换为 Instant
Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
// 3. 转换为 Timestamp
Timestamp timestampFromString = Timestamp.from(instant);
System.out.println("从字符串解析的 Timestamp: " + timestampFromString);
}
}
总结与最佳实践
| 场景 | 推荐方法 | 示例代码 |
|---|---|---|
| 获取当前时间 | Timestamp.from(Instant.now()) |
Timestamp ts = Timestamp.from(Instant.now()); |
从 java.util.Date 转换 |
new Timestamp(date.getTime()) |
Timestamp ts = new Timestamp(myDate.getTime()); |
从 LocalDateTime 转换 |
Timestamp.from(ldt.atZone(zone).toInstant()) |
Timestamp ts = Timestamp.from(myLocalDateTime.atZone(ZoneId.systemDefault()).toInstant()); |
| 从字符串解析 | 先解析为 LocalDateTime,再转为 Instant,最后转为 Timestamp |
见上方示例 |
| 从数据库获取 | JDBC ResultSet.getTimestamp() |
Timestamp ts = resultSet.getTimestamp("my_timestamp_column"); |
核心要点:
- 首选
java.timeAPI:在 Java 8 及以上版本,所有与日期和时间相关的操作都应优先使用java.time包(如Instant,LocalDateTime,ZonedDateTime等),这些 API 设计更优秀,更不容易出错。 - 转换桥梁是
Instant:java.sql.Timestamp和java.timeAPI 之间的标准转换桥梁是Instant。Timestamp.from(Instant)和timestamp.toInstant()这两个方法。 - 避免直接使用
Date:除非必须与遗留代码交互,否则应尽量避免使用旧的java.util.Date和java.sql.Date类。 - 注意时区:在将
LocalDateTime等不带时区的对象转换为Instant(UTC时间)时,必须明确指定一个时区,否则可能会得到错误的结果,通常使用ZoneId.systemDefault()获取系统默认时区。
