Nodejs 一个关于 Linux 时区和 JS 获取的时间的问题?

发布于 1周前 作者 vueper 来自 nodejs/Nestjs

Nodejs 一个关于 Linux 时区和 JS 获取的时间的问题?

在服务器上,执行

date

# 返回的时间戳的时区是 CST,如:Fri May 24 14:07:12 CST 2019

在 NodeJS 里执行

new Date() //返回的时间比上面获取的时间慢几个小时(说明时区不一样)

由于 用 PM2 管理进程,而 PM2 是基于 JS 写的,导致设置 cron 的任务时间都有问题。

想知道 JS 获取到的时间是根据上面时区的,难道不是随系统的吗?


9 回复

默认输出 utc 吧,这样不会引起混淆


在我电脑上 new Date().getHours() 返回的是我电脑时区当前的小时啊。。。

NodeJs 内部使用 ICU 进行时间格式化

服务器里设置时区就行了,相关包是 tzdata 和 TZ 环境变量
new Date() 打印的是 UTC 时间

getHours 返回本地时间,你的电脑上已经设置了时区

是啊,但我执行 date 出来的是 CST 时间啊,为什么 getHours 慢了几个小时呢?

只说你的服务器
date 打印出来的 CST 是 China Standard Time
TZ=Asia/Shanghai date 北京时间
TZ=CST date (这里的 CST 是 Central Standard Time ) CST 时间
然后看 node 里 new Date().getTimezoneOffset() 的结果是不是 -480


看了一下,date +"%Z %z" 出来的时区是 CST +0800,
但是 node 里 new Date().getTimezoneOffset() 的结果是 240

我也觉得好奇怪。



执行 timedatectl 输出:
。。。
Time zone: America/New_York (CST, +0800)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no

搞不懂为什么 America/New_York 也是 +0800…

通过修改
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
改了时区就可以了。。。

在Node.js中处理Linux时区和JavaScript获取的时间时,通常需要注意几个关键点:Node.js运行环境的时区设置、JavaScript的Date对象默认时区(通常是UTC+0),以及如何使用第三方库来简化时区处理。

首先,Node.js默认会使用操作系统的时区设置。你可以通过运行date命令在Linux终端中查看当前时区设置。

date

在Node.js中,Date对象默认创建的是UTC时间,但你可以通过toLocaleString等方法将其转换为本地时间。例如:

const now = new Date();
console.log(now.toLocaleString()); // 输出本地时间

然而,对于更复杂的时区处理,建议使用moment-timezonedate-fns-tz等库。以下是使用moment-timezone的示例:

const moment = require('moment-timezone');

// 设置时区
moment.tz.setDefault('Asia/Shanghai');

// 获取当前时间
const now = moment();
console.log(now.format()); // 输出设置时区的时间

在这个例子中,我们首先将默认时区设置为Asia/Shanghai,然后获取当前时间并格式化输出。

总之,处理时区问题时,确保你的Node.js运行环境时区设置正确,并考虑使用第三方库来简化跨时区的时间处理。如果你需要更精确的时间处理(如毫秒级精度),请确保你的系统时钟和网络时间协议(NTP)同步服务是准确的。

回到顶部