接口返回的时间和实际差了 8 个小时,是怎么回事?

Mores小栋博客!

数据库里存的时间是对的,但接口返回到前端显示出来,比实际时间早了(或晚了)8 个小时,问题出在哪里?

回答 1阅读 0

1 个回答

  1. Mores小栋博客!

    差 8 个小时,基本可以确定是 UTC 和北京时间(UTC+8)混用了:某一个环节把北京时间当成 UTC 处理,或者反过来。

    比较稳妥的做法是全链路统一:

    1. 数据库里存 UTC。PostgreSQL 用 timestamptz 类型;MySQL 的 DATETIME 不带时区信息,要约定好存的都是 UTC。
    2. 接口返回带时区的 ISO 8601 字符串,比如 2026-10-20T12:00:00Z 或 2026-10-20T20:00:00+08:00,不要返回 2026-10-20 20:00:00 这种不带时区的格式。
    3. 前端只在显示时按用户所在时区转换。

    在前端格式化时可以明确指定时区:

    JavaScript
    new Date("2026-10-20T12:00:00Z").toLocaleString("zh-CN", {
      timeZone: "Asia/Shanghai",
    });
    // "2026/10/20 20:00:00"

    另外检查一下服务器、Docker 容器和数据库连接各自的时区设置。容器默认是 UTC,同一份代码在本机运行正常、部署后就差 8 小时,多半是这个原因。

0 条回复

A文章作者M管理员
上传评论图片

暂无讨论,说说你的看法吧