将格式化日期字符串更新为 UTC 值

Update formatted date string to UTC value

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

因此,如果我有上述值,我想将时间更新为其 UTC 值。因此,如果我在 EST 时区,我想将 2020-12-01 转换为 2020-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

鉴于:

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”。