如何在NestJS+TypeORM中获取PostgreSQL的正确日期
解决PostgreSQL时间查询时区偏移问题
问题原因
你数据库中存储的是不带时区的时间戳(timestamp without time zone),客户端查询时,驱动/ORM会默认将其转换为UTC时区格式返回,导致显示时间比原始存储时间少4小时(对应UTC+4时区,比如格鲁吉亚第比利斯时区)。
修复方案
1. 修改数据库字段类型为带时区的时间戳
把createdAt和updatedAt字段类型从timestamp without time zone改为timestamptz(timestamp with time zone的简写),存储时会自动关联时区信息,查询时返回准确时间:
ALTER TABLE categories ALTER COLUMN "createdAt" TYPE timestamptz USING "createdAt" AT TIME ZONE 'Asia/Tbilisi'; -- 替换为你的数据库所在时区 ALTER TABLE categories ALTER COLUMN "updatedAt" TYPE timestamptz USING "updatedAt" AT TIME ZONE 'Asia/Tbilisi';
2. 调整客户端/ORM的时区配置
如果用ORM(如Sequelize、TypeORM),直接设置连接时区为数据库所在时区:
- Sequelize示例:
const sequelize = new Sequelize('database', 'user', 'password', { dialect: 'postgres', timezone: 'Asia/Tbilisi' // 也可直接写'+04:00' });
- TypeORM示例:
createConnection({ type: 'postgres', host: 'localhost', timezone: 'Asia/Tbilisi', // 其他配置项 });
3. 查询时显式转换时区
不想修改字段或ORM配置的话,可在SQL中直接转换时间:
SELECT id, name, "parentId", "createdAt" AT TIME ZONE 'Asia/Tbilisi' AS "createdAt", "updatedAt" AT TIME ZONE 'Asia/Tbilisi' AS "updatedAt" FROM categories;
要保留原始无时区格式的字符串,可转成指定格式:
SELECT id, name, "parentId", TO_CHAR("createdAt", 'YYYY-MM-DD HH24:MI:SS.US') AS "createdAt", TO_CHAR("updatedAt", 'YYYY-MM-DD HH24:MI:SS.US') AS "updatedAt" FROM categories;
4. 确认数据库服务器时区设置
检查当前数据库时区:
SHOW timezone;
若时区不正确,修改postgresql.conf里的timezone参数,重启数据库服务:
timezone = 'Asia/Tbilisi'
内容的提问来源于stack exchange,提问作者luka
相关产品推荐
相关产品推荐

