首页 > 解决方案 > 使用 2019 年巴西夏令时的节点

问题描述

我正在尝试使用 NodeJS 日期,但它返回的是巴西夏令时 (-2) 而不是正常日期 (-3) 的日期。今年巴西没有夏令时,所以应该是-3。

我试过:new Date().toString()在节点 REPL 中,输出有:'Mon Dec 02 2019 11:22:28 GMT-0200 (Brasilia Summer Time)'. 我尝试使用 ENV 将 TZ 设置为America/Sao_Paulo,结果是相同的。

我的计算机中的时间应该是 -3:如果我date在我得到的终端中运行Mon 2 Dec 10:23:15 -03 2019并且在 Python REPL 中运行,结果也是正确的。

标签: node.jslinuxtimezone

解决方案


我建议您确保运行 LTS 或当前版本的最新 Node.js 版本,例如 12.13.1+ 或 13.2+

对于 LTS,我相信您想要版本 12.13.1,更改日志在这里:https ://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V12.md#12.13.1 ,这显示了更新巴西夏令时变更。

由于 DST 更改是在 2019 年 4 月进行的(我相信),旧的 Node 版本无法反映它们。

如果我将时区设置为巴西,并执行以下操作(在节点 12.13.1 中):

console.log("Current time:", new Date().toString());

我得到输出:

Current time: Mon Dec 02 2019 11:20:56 GMT-0300 (Brasilia Standard Time)

哪个是对的

但是,我使用 Node 12.13.0 得到了 -2 小时的 UTC 偏移量。

我还建议尝试moment.jsmoment-timezone如果这不起作用,它们已经更新以反映巴西 DST 的变化,你可以这样做:

console.log(moment("2019-06-01T00:00:00Z").tz("America/Sao_Paulo").format());
console.log(moment("2019-12-01T00:00:00Z").tz("America/Sao_Paulo").format());

这给了我结果:

2019-05-31T21:00:00-03:00
2019-11-30T21:00:00-03:00

我认为这是正确的(每个UTC -3:00)

您还可以从中获取 UTC 偏移量

console.log(moment.tz.zone("America/Sao_Paulo").utcOffset(new Date("2019-06-01T00:00:00Z").getTime())); 
console.log(moment.tz.zone("America/Sao_Paulo").utcOffset(new Date("2019-12-01T00:00:00Z").getTime()));

这应该为 12 月 1 日和 6 月 1 日提供 180 分钟(这实际上是 UTC 偏移的负数,这是由于 IANA 时区数据库,并且很容易简单地切换符号)。


推荐阅读