【问题标题】:Daylight savings in moment即时夏令时
【发布时间】:2020-03-08 16:08:34
【问题描述】:

我正在发送一个选定的日期,设置为一天的开始(小时、分钟和秒设置为 0)转换为 UTC 日期以及从我的客户端应用程序到我的服务器的 new Date().getTimezoneOffset() 的偏移量。在服务器中,我需要将 UTC 日期转换回原始日期以显示在报告中。但是,当我尝试将 UTC 日期转换回原始时区中的日期时,它会按日期关闭。我发现 11 月 4 日之前的日期就是这种情况,我认为这可能是因为夏令时。

我正在使用服务器上的时刻 moment(utcDate).utcOffset(offset).format('DD/MM/YYYY') 来尝试获取正确的日期。

如果发送的日期是太平洋标准时间 26/10/2019 00:00 的 UTC 格式日期,那么当它被转换回服务器时,我得到的是 25/10/2019。

客户端发送的 UTC 日期为 2019-11-01T07:00:00.000Z,发送的偏移量为 480。 在服务器上,我尝试使用 moment('2019-11-01T07:00:00.000Z').utcOffset(-480).format('DD/MM/YYYY hh:mm a' 来取回日期) 并得到 "31/10/2019 11:00 pm"

【问题讨论】:

    标签: javascript datetime momentjs


    【解决方案1】:

    如果客户端位于太平洋时区,480 (UTC-8) 是 2019 年 11 月 1 日的错误偏移量。当天,夏令时生效,偏移量为 UTC-7。

    问题不在于您在服务器端的解释,而在于您如何在客户端收集时区偏移量。

    new Date().getTimezoneOffset()
    

    这给出了给定日期对象的有效偏移new Date() 给出当前 日期和时间。 2019 年的 DST 于 11 月 3 日凌晨 2 点结束,因此您现在运行它时将获得与上一个相关日期不同的偏移量。

    您应该更改客户端代码以返回正确的偏移量:

    new Date("2019-11-01T07:00:00.000Z").getTimezoneOffset()  // 420
    

    (如果你已经有Date 对象,请使用现有的对象。)

    或者,您可以更改您的客户端代码以返回一个 ISO 字符串,该字符串表示本地时间和偏移量,而不是 UTC。有一些例子只使用Date对象here,或者你可以只使用moment().format()

    【讨论】:

    • 除此之外,如果将 ISO 字符串发送到服务器,那么服务器将需要处理解析并将其拆分为 UTC 和时区偏移量(因为数据库可能会将其转换为UTC,然后丢弃时区信息)。该计算也可能由客户端进行。只需确保不要将 ISO 字符串存储到数据库中,因为您还想存储时区信息。以秒为单位的偏移量(不是以分钟为单位,因为由于 Unix 时间戳,您通常会以秒为单位执行更多计算)然后更好地存储。
    猜你喜欢
    • 2013-02-18
    • 2011-02-22
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2011-10-22
    • 2013-10-13
    相关资源
    最近更新 更多