在 Debian 上遇到 JS(Node.js / 前端 JS)日志时间不准,通常不是“系统时间错了”,而是时区或时间来源不一致导致的。下面按常见原因逐一说明。
Node.js 启动时会读取:
/etc/localtimeTZ 环境变量如果 Debian 时区不是你预期的(比如是 UTC,而你认为应该是 CST):
date
# 或
timedatectl
查看时区:
timedatectl | grep "Time zone"
如果不是你想要的:
sudo timedatectl set-timezone Asia/Shanghai
⚠️ 注意:修改时区后,已运行的 Node 进程不会自动生效,需要重启服务。
如果你在 Docker 里跑 Node.js:
UTCCST现象:
解决方式(任选):
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
或在 docker run:
-e TZ=Asia/Shanghai
new Date() 但输出格式不对console.log(new Date().toString());
这在 Node 里会按本地时区显示。
如果你看到的是:
Thu Jan 01 2026 02:00:00 GMT+0000 (UTC)
说明 Node 认为是 UTC。
✅ 建议显式格式化:
const moment = require('moment-timezone');
console.log(moment().tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss'));
或原生:
new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
}).format(new Date());
很多日志库默认用 UTC 写时间。
winston 示例修正:
const { format, createLogger } = require('winston');
createLogger({
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
)
});
⚠️ 注意:
format.timestamp() 默认是 UTC检查:
timedatectl status
若 System clock synchronized: no:
sudo apt install chrony
sudo systemctl enable --now chrony
或:
sudo ntpdate pool.ntp.org
如果你说的是浏览器里的 JS 日志:
这是正常现象,不是 bug。
date 看系统时间echo $TZ 看环境变量如果你愿意,可以告诉我:
我可以直接帮你给一段正确配置。