Node.js 日志里出现“时间错乱”(时间不对、时区错乱、顺序错乱、前后跳变等),通常不是 Node 本身“算错时间”,而是环境、配置或代码用法问题。下面按常见原因分类说明。
Node.js 默认使用系统本地时区。
new Date()
如果服务器是 UTC,而你认为应该是 Asia/Shanghai,日志就会“差 8 小时”。
✅ 解决:
# Linux
timedatectl set-timezone Asia/Shanghai
或容器里:
ENV TZ=Asia/Shanghai
即使系统时区对,Node 也可能用 UTC。
✅ 显式指定:
TZ=Asia/Shanghai node app.js
或在代码顶部:
process.env.TZ = 'Asia/Shanghai';
(⚠️ 必须在最早执行)
new Date().toISOString()
// 2026-01-15T02:00:00.000Z
Z 表示 UTC,很多人误以为是本地时间。
✅ 用本地时间格式化:
new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })
如:
winstonpinomorgan✅ winston 示例:
timestamp: () => new Date().toLocaleString('zh-CN')
多个进程同时写日志,顺序不一定是真实发生顺序。
✅ 解决:
pino + pino-prettypid 和精确时间戳进程退出太快,日志缓冲未写入。
✅ 确保:
process.on('exit', () => logger.flush())
date
✅ 同步时间:
ntpdate pool.ntp.org
# 或
timedatectl set-ntp true
容器不会自动同步时间。
✅ 挂载宿主机时间:
-v /etc/localtime:/etc/localtime:ro
const now = Date.now(); // 只算一次
✅ 每次都重新获取:
Date.now()
new Date(timestamp).getHours()
在不同环境结果不同。
✅ 用 Intl 或 dayjs / luxon:
import { DateTime } from 'luxon';
DateTime.now().setZone('Asia/Shanghai')
如果你看到:
常见原因:
date 系统时间对吗?TZ 设置了吗?如果你愿意,可以贴一段:
我可以直接帮你定位是哪一种“错乱”。