【问题标题】:Node using Brazil Summer Time in 2019使用 2019 年巴西夏令时的节点
【发布时间】:2019-12-02 13:29:05
【问题描述】:

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

我在 Node REPL 中尝试了:new Date().toString(),输出为:'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.js linux timezone


【解决方案1】:

我建议确保您运行的是 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 更改的更新。

由于 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 时区数据库,并且很容易简单地切换符号)。

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 2011-01-06
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多