杰瑞科技汇

Java中如何获取当前时间戳?

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

Java中如何获取当前时间戳?-图1
(图片来源网络,侵删)

下面我将分步详细讲解如何获取 Timestamp,并提供不同场景下的代码示例。


核心方法:Timestamp.from(Instant)

这是在 Java 8 及更高版本中获取 Timestamp推荐和最标准的方法。java.sql.Timestampjava.time.Instant 之间有一个明确的转换关系。

Instant 类代表时间线上的一个精确点,从 Unix 纪元(1970-01-01T00:00:00Z)开始计算,精度为纳秒。Timestamp 本质上也是存储了从 Unix 纪元开始的毫秒和纳秒数。

示例:获取当前时间的 Timestamp

这是最常见的需求。

Java中如何获取当前时间戳?-图2
(图片来源网络,侵删)
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 转换

LocalDateTimejava.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 的解析器将其解析为 LocalDateTimeInstant,然后再转换为 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");

核心要点:

  1. 首选 java.time API:在 Java 8 及以上版本,所有与日期和时间相关的操作都应优先使用 java.time 包(如 Instant, LocalDateTime, ZonedDateTime 等),这些 API 设计更优秀,更不容易出错。
  2. 转换桥梁是 Instantjava.sql.Timestampjava.time API 之间的标准转换桥梁是 InstantTimestamp.from(Instant)timestamp.toInstant() 这两个方法。
  3. 避免直接使用 Date:除非必须与遗留代码交互,否则应尽量避免使用旧的 java.util.Datejava.sql.Date 类。
  4. 注意时区:在将 LocalDateTime 等不带时区的对象转换为 Instant(UTC时间)时,必须明确指定一个时区,否则可能会得到错误的结果,通常使用 ZoneId.systemDefault() 获取系统默认时区。
分享:
扫描分享到社交APP
上一篇
下一篇