一、问题现象
org.postgresql.util.PSQLException: Cannot convert the column of type TIMESTAMPTZ to requested type java.time.LocalDateTime.
这个错误通常发生在以下场景:
- 数据库字段类型:
TIMESTAMP WITH TIME ZONE(TIMESTAMPTZ) - Java 实体类字段:
java.time.LocalDateTime - 框架:Spring Data JPA、MyBatis 或原生 JDBC 查询
二、根本原因深度解析
2.1 LocalDateTime 的本质:纯粹的"挂钟时间"
// 这只是一个日期时间的数值组合,不指向任何具体时刻
LocalDateTime.now(); // 输出:2026-01-14 15:30:00
// 关键特性:
// ❌ 不包含时区信息
// ❌ 不对应 UTC 时间轴上的唯一瞬间
// ✅ 只表示"年 - 月 - 日 时:分:秒"
LocalDateTime就像你家墙上的挂钟,它只告诉你"现在是下午 3 点半",但无法确定这是北京时间的 3 点半,还是纽约时间的 3 点半。
2.2 PostgreSQL TIMESTAMPTZ 的本质:绝对的"时刻"
-- 存储的是 UTC 时间戳 + 时区偏移量
SELECT '2026-01-14 15:30:00+08'::timestamptz; -- 实际存储(示例):
-- UTC 时间:2026-01-14 07:30:00
-- 时区偏移:+08:00
-- 显示值:2026-01-14 15:30:00+08
核心特点:
- ✅ 明确指向时间轴上的唯一瞬间(Instant)
- ✅ 包含时区偏移量(如 +08:00)
- ✅ 跨时区无歧义,全球唯一
2.3 为什么不能直接转换?
JDBC 驱动拒绝转换是为了防止致命的数据歧义:
// 假设数据库允许隐式转换
OffsetDateTime original = OffsetDateTime.of(
2026, 1, 14, 15, 30, , , ZoneOffset.ofHours()
);
original.toLocalDateTime();

