首页 > 解决方案 > 即时夏令时

问题描述

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

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

如果发送的日期是来自 PST 的 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')来取回日期 并得到“2019 年 10 月 31 日晚上 11:00”

标签: javascriptdatetimemomentjs

解决方案


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

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

new Date().getTimezoneOffset()

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

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

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

Date如果您已有对象,请使用现有对象。)

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


推荐阅读