杰瑞科技汇

Java timestamp如何转date?

核心转换方法

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

Java timestamp如何转date?-图1
(图片来源网络,侵删)

直接赋值(最简单、最常用)

这是最直接的方法,利用了 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 可以精确到纳秒。
  • DatetoString() 方法显示的格式可能与 Timestamp 不同,但它们代表的是同一个时间点。

不同场景下的最佳实践

在实际开发中,你可能会遇到不同的情况,比如从数据库获取时间戳、处理字符串时间等。

Java timestamp如何转date?-图2
(图片来源网络,侵删)

从数据库获取 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.Datejava.sql.Date/Timestamp 的现代化替代品,更安全、更易用。

java.time.Instant 可以看作是 java.util.Date 的现代等价物,它精确到纳秒。java.sql.Timestamp 也可以方便地与 Instant 互相转换。

Java timestamp如何转date?-图3
(图片来源网络,侵删)

TimestampInstant

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);
    }
}

InstantTimestamp

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 或遗留代码交互时,才进行 TimestampInstant 之间的转换。
分享:
扫描分享到社交APP
上一篇
下一篇