Nodejs 一个关于 Linux 时区和 JS 获取的时间的问题?
Nodejs 一个关于 Linux 时区和 JS 获取的时间的问题?
在服务器上,执行
date
# 返回的时间戳的时区是 CST,如:Fri May 24 14:07:12 CST 2019
在 NodeJS 里执行
new Date() //返回的时间比上面获取的时间慢几个小时(说明时区不一样)
由于 用 PM2 管理进程,而 PM2 是基于 JS 写的,导致设置 cron 的任务时间都有问题。
想知道 JS 获取到的时间是根据上面时区的,难道不是随系统的吗?
默认输出 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-timezone
或date-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)同步服务是准确的。