温馨提示×

nodejs日志时间不对怎么调

小樊
49
2026-09-20 20:52:28
栏目: 编程语言

Node.js 日志时间不对,通常是时区问题日志库配置问题。下面按常见情况给你排查和解决思路。


一、先确认是不是时区问题

Node.js 默认使用系统本地时区,但有时容器 / 服务器时区不对。

1. 查看当前时区

console.log(new Date())
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

如果输出不是你期望的时区(如 UTC),那就是时区问题。


二、解决方案

✅ 方案 1:设置 TZ 环境变量(最简单)

Linux / macOS

TZ=Asia/Shanghai node app.js

Windows(PowerShell)

$env:TZ="Asia/Shanghai"
node app.js

永久设置(Docker 示例)

ENV TZ=Asia/Shanghai

✅ 方案 2:在 Node 启动时设置

process.env.TZ = 'Asia/Shanghai'

⚠️ 要放在最顶部,任何其他代码之前。


✅ 方案 3:日志里手动格式化时间(推荐)

不要直接用 new Date().toString(),用 Intldayjs

使用 Intl

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`)

使用 dayjs(最常用)

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'))

三、常见日志库时间不对

1. winston

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 默认用本地时区,如果系统时区不对,日志就错。


2. pino

const pino = require('pino')
const logger = pino({
  timestamp: pino.stdTimeFunctions.isoTime
})

如需指定时区:

process.env.TZ = 'Asia/Shanghai'

四、Docker / 服务器特别注意

检查容器时区

date

如果是 UTC,而你要 CST:

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

五、快速自检清单 ✅

  • [ ] 系统时区对不对
  • [ ] Node 是否设置了 TZ
  • [ ] 日志库是否手动格式化时间
  • [ ] Docker 容器时区是否正确

如果你告诉我:

  • 用的 日志库(winston / pino / 原生)
  • 运行环境(Linux / Docker / Windows)

我可以直接给你一份可复制的配置代码

0