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

2019-05-24 14:15:37 +08:00
 nyse

在服务器上,执行

date

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

在 NodeJS 里执行

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

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

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

5279 次点击
所在节点    Node.js
8 条回复
blankme
2019-05-24 14:22:05 +08:00
默认输出 utc 吧,这样不会引起混淆
nyse
2019-05-24 14:34:14 +08:00
@blankme 在我电脑上 new Date().getHours() 返回的是我电脑时区当前的小时啊。。。
behanga
2019-05-24 14:43:36 +08:00
NodeJs 内部使用 ICU 进行时间格式化
zhuisui
2019-05-24 16:56:07 +08:00
服务器里设置时区就行了,相关包是 tzdata 和 TZ 环境变量
`new Date()` 打印的是 UTC 时间

@nyse getHours 返回本地时间,你的电脑上已经设置了时区
nyse
2019-05-24 22:04:52 +08:00
@zhuisui 是啊,但我执行 date 出来的是 CST 时间啊,为什么 getHours 慢了几个小时呢?
zhuisui
2019-05-25 12:44:27 +08:00
@nyse 只说你的服务器
date 打印出来的 CST 是 China Standard Time
TZ=Asia/Shanghai date 北京时间
TZ=CST date (这里的 CST 是 Central Standard Time ) CST 时间
然后看 node 里 new Date().getTimezoneOffset() 的结果是不是 -480
nyse
2019-05-25 13:39:04 +08:00
@zhuisui
看了一下,date +"%Z %z" 出来的时区是 CST +0800,
但是 node 里 new Date().getTimezoneOffset() 的结果是 240

我也觉得好奇怪。
nyse
2019-05-25 14:21:42 +08:00
@zhuisui

执行 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
改了时区就可以了。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/567294

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX