node.js - 使用 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 中运行,结果也是正确的。
解决方案
我建议您确保运行 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.js和moment-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 时区数据库,并且很容易简单地切换符号)。
推荐阅读
- angular - 将材料和形式添加到角度库
- reactjs - 将未编译的打字稿库添加到 Craco 配置
- sql - 查找具有重叠地理点的半径的地理点
- java - 多部分 API 的 Spring Boot 应用程序中的不同文件/请求大小限制
- c# - 依赖注入 - 多个项目
- python - 在带有 PIL 的 tkinter GUI 中使用生成的图像
- android - 物理设备无法在 Android Studio 中运行:多个 RSA 密钥指纹,但只有一个 adbkey.pub
- python - 张量流中填充和屏蔽序列的模型损失
- c++ - GLSL 日志返回未定义的结果
- python-3.x - Pandas 在多个条件下按列删除和移动单元格