数据库里存的时间是对的,但接口返回到前端显示出来,比实际时间早了(或晚了)8 个小时,问题出在哪里?
1 个回答
Mores小栋博客!差 8 个小时,基本可以确定是 UTC 和北京时间(UTC+8)混用了:某一个环节把北京时间当成 UTC 处理,或者反过来。
比较稳妥的做法是全链路统一:
- 数据库里存 UTC。PostgreSQL 用
timestamptz类型;MySQL 的DATETIME不带时区信息,要约定好存的都是 UTC。 - 接口返回带时区的 ISO 8601 字符串,比如
2026-10-20T12:00:00Z或2026-10-20T20:00:00+08:00,不要返回2026-10-20 20:00:00这种不带时区的格式。 - 前端只在显示时按用户所在时区转换。
在前端格式化时可以明确指定时区:
JavaScriptnew Date("2026-10-20T12:00:00Z").toLocaleString("zh-CN", { timeZone: "Asia/Shanghai", }); // "2026/10/20 20:00:00"另外检查一下服务器、Docker 容器和数据库连接各自的时区设置。容器默认是 UTC,同一份代码在本机运行正常、部署后就差 8 小时,多半是这个原因。
- 数据库里存 UTC。PostgreSQL 用
正在读取登录状态…
暂无讨论,说说你的看法吧