如何配置pgx驱动从PostgreSQL数据库获取UTC时间值
问题原因
pgx 的stdlib兼容模式默认不会自动解析连接字符串里的timezone参数设置会话时区,会直接使用程序运行环境的本地时区解析timestamptz类型值,这和pq、pgdriver的默认行为不一致,也是你加了DSN参数依然拿到东2区时间的根本原因。
可行配置方案
不要直接调用sql.Open传DSN字符串初始化连接,手动构建pgx连接配置、显式指定会话时区参数,再生成供database/sql和Ent使用的连接实例:
import ( "database/sql" "github.com/jackc/pgx/v4" "github.com/jackc/pgx/v4/stdlib" ) // 解析基础连接配置 cfg, err := pgx.ParseConfig("postgres://postgres:postgres@localhost/project?sslmode=disable") if err != nil { // 自行处理错误 } // 显式指定会话时区为UTC,该配置会在连接建立时同步给PostgreSQL服务端 cfg.RuntimeParams["timezone"] = "UTC" // 生成标准database/sql连接实例 db := stdlib.OpenDB(*cfg) // 初始化Ent客户端时直接传入该db实例即可
配置完成后可验证:
- 执行
show timezone返回值为Etc/UTC - 查询
used_at字段返回的时间值和数据库存储的UTC时间完全一致,无额外时区偏移
如果你用的是pgx v5版本,配置逻辑完全相同,仅需把导入路径替换为v5对应的路径即可。
避坑提醒:不要在Go代码侧对返回的时间值手动做UTC转换。如果连接时区配置错误,pgx在扫描值阶段就已经做了错误的时区偏移,后续手动转换只会得到错误的时间点,必须在连接初始化阶段就把时区配置正确。
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

