“Node.js 日志时间错乱”通常不是 Node 本身写错了时间,而是时区、日志库配置、容器环境或序列化方式导致的。下面按常见原因给你一套排查和解决思路。
console.log(new Date())
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
如果输出是 UTC 而你在中国,日志就会“差 8 小时”。
TZ=Asia/Shanghai node app.js
或在 package.json:
{
"scripts": {
"start": "TZ=Asia/Shanghai node app.js"
}
}
ENV TZ=Asia/Shanghai
或挂载时区:
-v /etc/localtime:/etc/localtime:ro
winston 默认用 UTC。
✅ 正确写法:
const winston = require('winston')
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss' // 本地时间
}),
winston.format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
),
transports: [new winston.transports.Console()]
})
❌ 错误示例(UTC):
winston.format.timestamp() // 默认 ISO UTC
pino 默认也是 UTC。
✅ 解决:
const pino = require('pino')
const logger = pino({
timestamp: () => `,"time":"${new Date().toLocaleString()}"`
})
或更推荐:
TZ=Asia/Shanghai node app.js
date
timedatectl
TZlogger.info({ time: new Date() })
JSON 序列化后可能是:
{ "time": "2026-01-15T02:00:00.000Z" }
✅ 解决:
logger.info(`time: ${new Date().toLocaleString()}`)
✅ 最佳实践:
new Date(logTime).toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })
TZ 是否设置如果你愿意,可以贴一下:
我可以直接帮你改配置。