将 CST/CDT 转换为 UTC Javascript
Convert CST/CDT to UTC Javascript
我有字符串格式的时间,这是 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 日。
我不知道我的代码有什么问题
您可以尝试使用 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 的相同代码给出了结果:
Local time (Central): 2021-05-15T23:10:23.000-05:00
UTC time: 2021-05-16T04:10:23.000Z
所以可能是环境不同造成的。您是否尝试过使用更高版本的 Node.js?
使用 node:10.24
Docker 图像我得到以下输出
Local time (Central): 2021-05-16T11:10:23.000-05:00
UTC time: 2021-05-16T16:10:23.000Z
所以在我看来这是一个 Node.js 版本问题。我建议尝试稍后的 Node.js 版本。我试过 node v12.16.1 并得到了正确的输出。所以我建议至少尝试使用节点 v12 来解决您的问题。
我有字符串格式的时间,这是 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 日。
我不知道我的代码有什么问题
您可以尝试使用 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 的相同代码给出了结果:
Local time (Central): 2021-05-15T23:10:23.000-05:00 UTC time: 2021-05-16T04:10:23.000Z
所以可能是环境不同造成的。您是否尝试过使用更高版本的 Node.js?
使用 node:10.24
Docker 图像我得到以下输出
Local time (Central): 2021-05-16T11:10:23.000-05:00 UTC time: 2021-05-16T16:10:23.000Z
所以在我看来这是一个 Node.js 版本问题。我建议尝试稍后的 Node.js 版本。我试过 node v12.16.1 并得到了正确的输出。所以我建议至少尝试使用节点 v12 来解决您的问题。