如何使用nodejs从系统获取本地时区

Mal*_*ith 13 time node.js

有没有办法使用nodejs从系统中获取本地时区(例如: - ubuntu)?

我使用moment.js来提取日期和时间值.但是也找不到提取时区的方法.

Tim*_*Tim 16

现有的答案将告诉您当前的时区偏移量,但如果您要比较历史/未来时间点,则会遇到问题,因为这不符合夏令时的变化.

在许多时区中,偏移量在一年中变化,这些变化发生在不同日期或根本不发生,具体取决于纬度.如果您只有UTC时间和偏移量,那么在一年中的其他不同时间,您永远无法确定该位置的偏移量.

例如,UTC + 2:00偏移可以指夏季的巴塞罗那或全年的象牙海岸.2小时的偏移量将始终显示在象牙海岸的正确时间,但在巴塞罗那的半年内将持续1小时.

查看本文涵盖上述内容.

我们如何迎合所有这些时区问题?嗯,这很简单:

  1. 以UTC格式保存所有时间
  2. 存储发生这种情况的时区名称

在JavaScript中,您可以使用Moment Timezone来猜测用户时区,尽管我只是在浏览器中对此进行了测试:

Intl.DateTimeFormat().resolvedOptions().timeZone // eg. 'America/Chicago'
Run Code Online (Sandbox Code Playgroud)

然后,您可以在Moment Timezone中使用此时区字符串来帮助抵消捕获的UTC时间.

  • [国际 API 现在是标准的](/sf/ask/76396071/#55204472),这使得 moment.js 不再需要简单的任务。此外,现在有更轻量级的 moment.js 替代品。 (3认同)
  • 由于问题是关于 Node.js 的,值得注意的是 Intl 从 0.11 版本开始就可用。 (3认同)
  • 这是正确答案。偏移量和时区相关但不同,如果您的代码需要考虑夏令时,则可能会造成严重破坏。 (2认同)

vks*_*ack 5

这很简单。

var x = new Date();
var offset= -x.getTimezoneOffset();
console.log((offset>=0?"+":"-")+parseInt(offset/60)+":"+offset%60)
Run Code Online (Sandbox Code Playgroud)

而且没有别的,或者您可以看看momentJS是否可以帮助您。

  • 这个很好,但是如果 offset 为负数,你会得到 -- 4:0,添加填充函数也是一个好主意 (2认同)
  • 偏移量与时区不同。两个时区可以具有相同的偏移量,但具有不同的 DST 规则。 (2认同)

Fat*_*tie 5

就是这么简单,不需要库:

console.log("test ...")
let d = new Date()
console.log("UTC time " + d)
let ank = d.toLocaleString('en-US', { timeZone: 'America/Anchorage' });
console.log("your time zone " + ank)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何查看大多数服务器上的确切时区名称:

ls /usr/share/zoneinfo
Run Code Online (Sandbox Code Playgroud)

完美运行:

无论夏令时问题等如何,您都会获得正确的时间文本。


方便的相关mysql提示:

在几乎所有服务器上,mysql也需要知道tz信息。

基本上解决方案是,在外壳上

sudo mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql

..谷歌更多有关它的信息。