javascript - 即时夏令时
问题描述
我正在发送设置为一天开始的选定日期(小时、分钟和秒设置为 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”
解决方案
如果客户端位于太平洋时区,则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()
推荐阅读
- android - 多项选择列表视图未显示所有对象
- clang - 如何计算 RISCV-clang 中的时钟周期数
- php - Codeigniter 表单验证在 ajax 请求上返回 false
- ruby-on-rails - 如何检查字符串是文件内容还是路径?
- javascript - 仅在单击时添加 div 并允许客户将其删除并重新单击
- solr - Solr 精确匹配过滤
- mongodb - 使用 mongo_dart 连接到 MongoDB Atlas
- mysql - 如何为一个wordpress项目同步两个数据库?
- javascript - selenium.common.exceptions.WebDriverException:消息:未知错误:“脚本”必须是字符串,同时通过 Selenium Python 使用 execute_script()
- asp.net - 将 updatepanel 用作 ModelpopupExtender 的 PopupControl 时,单击事件不会触发