Node.js 错误地识别夏令时

Posted

技术标签:

【中文标题】Node.js 错误地识别夏令时【英文标题】:Daylight Savings Time wrongly identified by Node.js 【发布时间】:2014-11-03 09:37:27 【问题描述】:

我遇到了时区、DST 和 Node.js 的问题。它不能正确识别 DST 效果。我的操作系统是 Windows 8.1,并且设置了时区值和 DST。我尝试了这两种方法:

1) 节点的日期对象

我在 Node Prompt 中输入了以下代码并收到了斜体的答案:

new Date()

2014 年 9 月 9 日星期二 18:42:36 GMT-0200(Horário brasileiro de verão(巴西夏令时))

不过,巴西的夏令时刚从 10 月 19 日开始,我们现在不在夏令时。因此,小时从现在开始偏移 1 小时。

2) 节点时间

我从 npm 获得了节点时间包,以便能够更改时区。在代码中:

time = require('time');
dateFormat = require('dateformat');

now = time.Date();
console.log(dateFormat(now.setTimezone('America/Sao_Paulo').getTime(), "yyyy-mm-dd HH:MM:ss Z"))

结果,我得到了

2014-09-09 18:42:36 GMT-0200

巴西标准时区是 GMT-0300。小时也偏移 1 小时。

我做错了吗?有解决方法吗?

【问题讨论】:

【参考方案1】:

节点时间包does not work on Windows。我什至无法安装它,所以我不确定你是怎么做的。你应该卸载它。

如果您需要在 Node(或浏览器)中支持非本地时区,我建议使用 moment.js 和 moment-timezone 插件。

在设置为巴西的时区的 Windows 上运行 new Date(),我得到了正确的输出。

唯一可以解释您的结果的是,如果修改了时区注册表设置 - 但是您还会在任务栏上的系统时钟中看到错误的时间。所以很抱歉,我无法重现其中的那部分。

【讨论】:

嗨,马特!非常感谢。实际上,时区在 node-time 包中没有任何影响(虽然安装成功)。我得到的错误是由于我设置了一个 TZ 环境变量而忘记删除。在 Node 中安装 moment-timezone 就足够了,现在它运行良好。

以上是关于Node.js 错误地识别夏令时的主要内容,如果未能解决你的问题,请参考以下文章

Swift DateFormatter 错误地转换字符串日期/时间

我所在国家/地区的夏令时已更改,但 C#/Windows 无法识别更改

Java 1.7无法识别夏令时的变化

为啥 R 在多年之间不能始终如一地处理夏令时?

.NET TimeZoneInfo 关于夏令时错误

Spring @DateTimeFormat 转换错误与夏令时