TIMESTAMPTZ
的存储与显示机制
-
PostgreSQL 内部统一存储 UTC 时间。
-
你插入
2025-09-26 23:59:59+08
,PG 会自动转换成 UTC:
-
-
查询时,PostgreSQL 会根据 当前会话的时区 自动转换成当地时间显示。
-
也就是说,你插入的时间是带时区的绝对时间点,查询时 PG 会做时区换算。
-
2️⃣ 示例:北京时间插入,另一个美国服务器读取
假设:
-
插入时间(北京时间 UTC+8):
-
实际存储在数据库内部(UTC):
情况 A:业务服务器在纽约(UTC-4,美国东部夏令时)
-
会话时区设置:
-
查询:
-
PostgreSQL 会自动把 UTC 转成当地时间:
✅ 直接查询就得到正确的美国本地时间。
3️⃣ 注意事项
-
确保会话时区正确
-
默认情况下,如果没有设置,PG 会用数据库服务器或客户端环境变量
TimeZone
。 -
建议业务服务器在连接 PG 时设置会话时区:
或者在连接字符串里指定:
-
-
不要手动转换 UTC
-
插入时带时区即可,查询时 PG 会自动处理,无需额外计算。
-
-
显示格式
-
SELECT last_login_time
默认显示带时区的时间。 -
如果想显示 UTC,可以:
-
4️⃣ 总结
-
TIMESTAMPTZ
是 绝对时间点,跨时区安全。 -
插入带时区时间,内部存储 UTC。
-
查询时 PostgreSQL 会根据 会话时区自动转换。
-
只要会话时区正确设置,直接 SELECT 就能得到正确的当地时间,无需额外操作。