Node.js 日志时间不对,通常是时区问题或日志库配置问题。下面按常见情况给你排查和解决思路。
Node.js 默认使用系统本地时区,但有时容器 / 服务器时区不对。
console.log(new Date())
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
如果输出不是你期望的时区(如 UTC),那就是时区问题。
TZ=Asia/Shanghai node app.js
$env:TZ="Asia/Shanghai"
node app.js
ENV TZ=Asia/Shanghai
process.env.TZ = 'Asia/Shanghai'
⚠️ 要放在最顶部,任何其他代码之前。
不要直接用 new Date().toString(),用 Intl 或 dayjs。
const time = new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
hour12: false,
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
}).format(new Date())
console.log(`[${time}] log`)
const dayjs = require('dayjs')
const tz = require('dayjs/plugin/timezone')
const utc = require('dayjs/plugin/utc')
dayjs.extend(utc)
dayjs.extend(tz)
console.log(dayjs().tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss'))
const { createLogger, format, transports } = require('winston')
const logger = createLogger({
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
),
transports: [new transports.Console()]
})
⚠️ winston 默认用本地时区,如果系统时区不对,日志就错。
const pino = require('pino')
const logger = pino({
timestamp: pino.stdTimeFunctions.isoTime
})
如需指定时区:
process.env.TZ = 'Asia/Shanghai'
date
如果是 UTC,而你要 CST:
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
TZ如果你告诉我:
我可以直接给你一份可复制的配置代码。