You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:57:31