在Java中实现字符串与PostgreSQL Timestamp的互转
我来帮你搞定这两个和PostgreSQL时间交互的问题,分两部分详细说明:
Part 1:将指定格式的日期字符串写入PostgreSQL Timestamp列
你的日期字符串带时区偏移(+0000),推荐用Java 8引入的java.time API处理(比旧的java.sql.Timestamp类更严谨),以下是两种可行方案:
方案一(推荐,Java 8+ + JDBC 4.2+)
JDBC 4.2及以上版本直接支持java.time类型,无需手动转换:
import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class DateInsertDemo { public static void main(String[] args) { // 你的原始日期字符串 String dateStr = "2006-02-16T21:36:32.000+0000"; // 定义匹配的日期格式器 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); // 解析为带时区偏移的日期对象 OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateStr, formatter); // 假设已获取数据库连接conn String sql = "INSERT INTO your_table (timestamp_column) VALUES (?)"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { // 直接传入OffsetDateTime,PostgreSQL会自动映射到Timestamp类型 pstmt.setObject(1, offsetDateTime); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } }
方案二(兼容旧版JDBC/API)
如果项目依赖旧版API,可以先转成Instant再生成Timestamp:
import java.sql.Timestamp; import java.time.Instant; import java.time.format.DateTimeFormatter; // ... String dateStr = "2006-02-16T21:36:32.000+0000"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); Instant instant = Instant.from(formatter.parse(dateStr)); Timestamp timestamp = Timestamp.from(instant); // 后续用pstmt.setTimestamp(1, timestamp)写入数据库
Part 2:从PostgreSQL读取Timestamp并转成指定格式的字符串
你之前的代码Timestamp.valueOf(2006-02-16T21:36:32.000+0000)有两个问题:一是字符串没加引号(语法错误),二是Timestamp.valueOf()只接受不带时区的yyyy-MM-dd HH:mm:ss格式,你的输入带T分隔符和时区偏移,必然报错。正确做法如下:
方案一(推荐,用java.time API读取)
直接从数据库读取为OffsetDateTime,再格式化输出:
import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DateReadDemo { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); String sql = "SELECT timestamp_column FROM your_table WHERE id = ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, 1); // 假设查询条件为id=1 ResultSet rs = pstmt.executeQuery(); if (rs.next()) { // 直接读取为带时区的OffsetDateTime OffsetDateTime offsetDateTime = rs.getObject("timestamp_column", OffsetDateTime.class); // 格式化成目标字符串 String formattedDate = offsetDateTime.format(formatter); System.out.println(formattedDate); // 输出:2006-02-16T21:36:32.000+0000 } } catch (SQLException e) { e.printStackTrace(); } } }
方案二(读取为Timestamp再转换)
如果读取到的是java.sql.Timestamp,可以转成OffsetDateTime后再格式化:
import java.sql.Timestamp; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; // ... if (rs.next()) { Timestamp timestamp = rs.getTimestamp("timestamp_column"); // 转换为UTC时区的OffsetDateTime(匹配原始时间的+0000) OffsetDateTime offsetDateTime = timestamp.toInstant().atOffset(java.time.ZoneOffset.UTC); String formattedDate = offsetDateTime.format(formatter); System.out.println(formattedDate); }
内容的提问来源于stack exchange,提问作者Raqib
相关产品推荐
相关产品推荐

