JS - 将 "Europe/Berlin" 日期转换为 UTC 时间戳

JS - Convert a "Europe/Berlin"-Date into a UTC-Timestamp

在我的 Docker-Container 中,它具有时区 Etc/UTC,我需要将表示 Europe/Berlin-时区中的日期的日期字符串转换为 UTC 时间戳。

所以假设 Europe/Berlin-日期是 2022-04-20T00:00:00

现在 UTC 时间戳应该等于 2022-04-19T22:00:00

但是当我这样做的时候

console.log(new Date("2022-04-20").getTime())

我得到 1650412800000 相当于 Europe/Berlin-timezone 中的 2022-04-20T02:00:00

我该怎么做?

编辑:

我尝试了各种库,但仍然无法管理

const { DateTime } = require("luxon")


var f = DateTime.fromISO("2022-04-20").setZone('Europe/Berlin').toUTC()
console.log(f)

f 中的等价邮票是 2022-04-20T02:00:00 :/

I need to convert a Date-String which represents a Date in Europe/Berlin-timezone into a UTC timestamp.

基本上,date-only 值无法转换为时间戳,除非您任意将 time 与该日期相关联。听起来您打算使用当地时间午夜 (00:00+02:00),但您看到的却是 UTC 午夜 (00:00Z)。

这取决于您构建 Date 对象的方式。您指定 new Date("2022-04-20"),根据 the ECMASCript spec 将被视为午夜 UTC。规范说:

... When the UTC offset representation is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as a local time.

是的,这与 ISO 8601 不一致,并且已经被讨论得令人作呕。

要解决此问题,请将 T00:00 附加到您的输入字符串,以便您专门询问当地时间。换句话说,new Date("2022-04-20T00:00").

就是说,如果您需要的不是“当地时间”,而是 恰好 Europe/Berlin,那么可以 - 您需要使用图书馆。在luxon中是这样的:

DateTime.fromISO('2022-04-20T00:00', {zone: 'Europe/Berlin'}).toUTC()