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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:43:30