首页 > 解决方案 > 将格式化的日期字符串更新为 UTC 值

问题描述

用户只能提交日期戳的日期部分,例如2020-12-01,假设时间是00:00:00

所以,如果我有上述值,我想将时间更新为它的 UTC 值。因此,如果我在 EST 时区,我想转换2020-12-012020-12-01 05:00:00考虑五个小时的偏移量。

我可以这样做date-fns-tz吗?

const { zonedTimeToUtc, format } = require("date-fns-tz");

const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;

const utcDate = zonedTimeToUtc(new Date("2020-12-01"), tz);

document.getElementById("app").innerHTML = `${format(
  utcDate,
  "yyyy-MM-dd HH:mm:ss"
)}
`;

上面的产量2020-11-30 19:00:00,将时间朝错误的方向移动了 5 个小时。

https://codesandbox.io/s/happy-hoover-dn417?file=/src/index.js:23-301

标签: javascriptdatetimedate-fns

解决方案


鉴于:

const utcDate = zonedTimeToUtc(new Date("2020-12-01"), tz);

内置解析器将用于解析字符串,因此它将被解析为 UTC,然后 date-fns 将为tz应用偏移量。不要那样做,使用:

const utcDate = zonedTimeToUtc("2020-12-01", tz);

以便 date-fns 使用tz解析字符串。现在utcDate.toISOString()生成“2020-12-01T05:00:00.000Z”,这是等效的 UTC 日期和时间,其中tz是 America/New_York。

Date-fns 似乎总是使用主机时区偏移量进行输出,timeZone选项只是更改文本偏移量,它不会修改实际的时间戳值。您可能必须先使用utcToZonedTime来调整日期。我与 date-fns 斗争,我发现文档严重缺乏有用的示例。

我只是使用toISOString并删除“T”和“Z”。


推荐阅读