从字符串和时区构建日期对象

Build Date object from string and timezone

我正在寻找一种方法来构建给定 date/time 字符串和时区的正确 Date 对象。

目前我有一个具有特定偏移量的时区列表,我想像这样简单地将它们合并在一起:

new Date(`${date} ${time} GMT${offset}`);
// new Date('2019-08-30 10:00:00 GMT+0100`);

但这样做并不关心夏令时,我得到了一个约会,提前一小时在夏天。

如果您有偏移量,您可以在 JavaScript date time format 中构建一个字符串并将其与 new Date 一起使用。格式如下所示:2019-08-30T10:00:00+0100.

看起来你的 offset 是字符串 "+0100"。如果是:

new Date(`${date}T${time}${offset}`);

实例:

const date = "2019-08-30";
const time = "10:00:00";
const offset = "+0100";

const dt = new Date(`${date}T${time}${offset}`);
console.log("toISOString:", dt.toISOString());
console.log("toLocaleString", dt.toLocaleString());

在我的时区(英国夏令时,GMT+0100)Chrome (V8),输出:

toISOString: 2019-08-30T09:00:00.000Z
toLocaleString 30/08/2019, 10:00:00

...这是有道理的,10:00:00 BST 是 09:00:00 GMT。

But doing it like this doesn't care about dst and I get an date, which is in the summer one hour ahead.

正确。您需要为日期提供正确的偏移量。您的时区列表应该有 DST 信息(如果没有,它是不完整的,不幸的是,它相当无用)。要正确地做到这一点,您需要使用适当的时区数据库,例如 IANA one. Your best bet for that isn't to do it yourself, but to use a library that does it for you, such as Moment timezone or the one you found, spacetime。但是,是的,您可以直接使用这些数据库文件,可以从上面的 link 访问它们。但请注意,"BST"(英国夏令时)或 "EDT"(U.S。东部夏令时)等常见时区 shorthand 术语 未标准化 以任何方式。 IANA 数据库使用 Europe/London (在此处插入 Brexit 笑话).

等区域