温馨提示×

为何nodejs日志时间不对

小樊
43
2026-09-09 13:11:53
栏目: 编程语言

Node.js 日志时间“不对”,通常不是 Node 本身算错了,而是时区或时间来源不一致导致的。下面按常见原因给你梳理一下:


1️⃣ Node.js 默认使用 UTC(最常见原因)

Node.js 内部时间基于 UTC,很多日志库默认输出 UTC 时间,而不是本地时间。

例如:

console.log(new Date().toString());
// 可能显示:Wed Jan 01 2025 08:00:00 GMT+0000 (UTC)

如果服务器在中国(GMT+8),你会看到日志“慢了 8 小时”。

解决方式

✅ 方式一:设置 TZ 环境变量

TZ=Asia/Shanghai node app.js

或在 package.json

"scripts": {
  "start": "TZ=Asia/Shanghai node app.js"
}

✅ 方式二:使用 dayjs / moment 指定时区

const dayjs = require('dayjs')
dayjs().tz('Asia/Shanghai').format()

2️⃣ 服务器系统时间本身不对

Node.js 读取的是 操作系统时间

检查系统时间:

date

如果系统时间不对:

# Linux
sudo ntpdate time.nist.gov
# 或
timedatectl set-timezone Asia/Shanghai

3️⃣ 容器 / Docker 时区问题(非常常见)

Docker 容器默认是 UTC。

解决

Dockerfile

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime

docker-compose

environment:
  - TZ=Asia/Shanghai

4️⃣ 日志库默认格式问题

winston

timestamp: () => dayjs().format('YYYY-MM-DD HH:mm:ss')

pino

pino({ timestamp: () => `,"time":"${dayjs().format()}"` })

5️⃣ 数据库时间 vs 应用时间

  • MySQL / PostgreSQL 存的是 UTC
  • 应用读出来没做转换

✅ 建议在展示层统一转时区,不要混用


✅ 快速自查清单

  • [ ] date 系统时间对吗?
  • [ ] Node 是否设置了 TZ
  • [ ] 是否在 Docker 里?
  • [ ] 日志库是否用 UTC?
  • [ ] 是否是“显示时间”而不是“真实时间”?

如果你愿意,可以贴一段:

  • 日志输出示例
  • 运行环境(本地 / Linux / Docker)
  • 用的日志库(console / winston / pino)

我可以帮你精确判断是哪一种原因。

0