【问题标题】:Build Date object from string and timezone从字符串和时区构建日期对象
【发布时间】:2020-01-03 11:33:43
【问题描述】:

我正在寻找一种方法来在给定日期/时间字符串和时区的情况下构建正确的 Date 对象。

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

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

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

【问题讨论】:

    标签: javascript date timezone timezone-offset


    【解决方案1】:

    如果您有偏移量,您可以在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());

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

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

    ...这是有道理的,英国夏令时 10:00:00 是格林威治标准时间 09:00:00。

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

    正确。您需要为日期提供正确的偏移量。您的时区列表应该有 DST 信息(如果没有,它是不完整的,不幸的是,相当无用)。要正确执行此操作,您需要使用正确的时区数据库,例如IANA one。你最好的选择不是自己做,而是使用一个为你做的库,比如Moment timezone或你找到的spacetime。但是,是的,您可以直接使用这些数据库文件,可以从上面的链接访问它们。但请注意,“BST”(英国夏令时间)或“EDT”(美国东部夏令时间)等常见时区速记术语在任何方面都没有标准化。 IANA 数据库使用Europe/London 之类的区域(在此处插入英国脱欧笑话)

    【讨论】:

    • 这与我的代码完全相同 - 问题是 dst,它在时区偏移中不受尊重。
    • @Philipp - 不,它并没有完全按照您的代码执行的操作。它以唯一受支持的格式创建字符串(您正在创建的字符串不会也不能保证跨浏览器工作)。我已经更新以解决 DST 问题,抱歉,我在问题的最后错过了这个问题(不像是一个很长的问题!不应该错过它)。
    • 我现在想出了spacetime 库。 spacetime(``${date} ${time}``, timezone).d 给我返回了一个 Date 对象,我以后可以再次将其用于 json 请求。
    • @Philipp - This one?凉爽的。我越想这个,我就越觉得这种操作属于 ECMA-402。我可能会提出一个问题。我的意思是,这总是出现。 :-)
    • WRT Ecma,请参阅(并投稿)github.com/tc39/proposal-temporal
    猜你喜欢
    • 2020-08-18
    • 1970-01-01
    • 2021-11-07
    • 2021-07-16
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多