【问题标题】:Convert CST/CDT to UTC Javascript将 CST/CDT 转换为 UTC Javascript
【发布时间】:2021-10-21 17:41:21
【问题描述】:

我有字符串格式的时间,即 CDT 或 CST 中的本地时间(取决于夏令时是否正在进行)。 前-

2021-08-19 15:55:40

所以它只是字符串数据,没有 tz 的指示,我想将这个本地时间转换为 UTC。 最好的方法是什么? 是否已经存在可以自动识别和转换的 npm 包?

我目前正在尝试使用的代码: 作为第一步,我尝试将 DateTime 转换为 ISO,它可以轻松转换为 UTC

const { DateTime } = require("luxon");
var overrideZone = DateTime.fromSQL("2021-05-15 23:10:23", { zone: "America/Mexico_City" });

console.log(overrideZone.toISO()) //=> '2021-05-16T11:10:23.000-05:00'

它给我的日期是 5 月 16 日,但显然我的意思是 5 月 15 日 23:10(晚上 11:10)而不是 16 日。

我不知道我的代码有什么问题

【问题讨论】:

  • 你试过momentjs吗? MomentJs
  • 查看this答案
  • 我正在尝试使用 Luxon(时刻的继任者),但得到了意想不到的结果,第一步我试图将日期时间转换为 ISO 字符串(使用正确的 tz),这样我就可以获得 UTS轻松:const { DateTime } = require("luxon"); var overrideZone = DateTime.fromSQL("2021-05-15 23:10:23", { zone: "America/Mexico_City" }); console.log(overrideZone.toISO()) //=> '2021-05-16T11:10:23.000-05:00' 这里我的日期是 16 号,但我的日期是 15 号,我不知道怎么了
  • 您可以将代码添加到问题中吗?
  • @AminTaghikhani 添加了

标签: javascript node.js time dst


【解决方案1】:

您可以尝试使用 DateTime.fromFormat() 函数来解析日期字符串,格式为 'yyyy-MM-dd HH:mm:ss'。

您可以使用setZone() 函数将DateTime 时区转换为UTC。我们将区域设置为“UTC”以转换为 UTC 时间。

注意:这里的工作修复是从 Node 10.24 升级到至少 Node 12.x

let { DateTime } = luxon;

const dateStr = '2021-05-15 23:10:23';
const zone = 'America/Mexico_City';

const dt = DateTime.fromFormat(dateStr, 'yyyy-MM-dd HH:mm:ss', { zone });
const utcTime = dt.setZone('UTC');

console.log('Local time (Central):', dt.toISO());
console.log('UTC time:', utcTime.toISO());
    
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.0.1/luxon.min.js" integrity="sha512-bI2nHaBnCCpELzO7o0RB58ULEQuWW9HRXP/qyxg/u6WakLJb6wz0nVR9dy0bdKKGo0qOBa3s8v9FGv54Mbp3aA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

在 Windows 10.0.19043.0 上使用 Node.js 14.15.5 和 luxon 2.0.2 运行相同的代码会得到结果:

当地时间(中部):2021-05-15T23:10:23.000-05:00 UTC 时间:2021-05-16T04:10:23.000Z

所以可能是由于环境的不同。您是否尝试过使用更高版本的 Node.js?

使用node:10.24 Docker 映像,我得到以下输出

当地时间(中部):2021-05-16T11:10:23.000-05:00 UTC 时间:2021-05-16T16:10:23.000Z

所以在我看来它就像一个 Node.js 版本问题。我建议尝试更高版本的 Node.js。我已经尝试过 node v12.16.1 并且得到了正确的输出。所以我建议至少尝试 node v12 来解决您的问题。

【讨论】:

  • 它在浏览器中对我来说工作正常,但是当在我的系统(节点)上运行时,它给出的结果是增加了 12 小时,Local time (Central): 2021-05-16T11:10:23.000-05:00 UTC time: 2021-05-16T16:10:23.000Z 这是我在系统上运行时收到的输出。通知日期已更改为当地时间 16 日和 11 日上午,这不应该这样做,但它正在发生
  • 这肯定很奇怪。您使用的是什么版本的 Node.js 和 Luxon?我会试试看能不能得到同样的结果。
  • node- v10.24.1, luxon- 2.0.2, 当代码在 gcp 云函数中运行时我也面临同样的问题
  • 在我看来(检查我更新的答案)就像 Node.js 版本是问题所在。节点 v12 及更高版本给出正确的结果。
  • 非常感谢您帮助我,更新节点版本为我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-04-10
  • 2018-11-08
  • 2018-07-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多