Moment.js调用add添加60分钟无效果,请求协助排查问题
问题排查:Moment.js添加60分钟后时间未变化
问题代码
var dateTimeFrom='2022-10-30 01:00' dateTimeFrom = moment(dateTimeFrom).add(60, "minutes").format("YYYY-MM-DD HH:mm") console.log(dateTimeFrom)
引入依赖:
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>
问题现象
预期输出 2022-10-30 02:00,但实际运行结果为 2022-10-30 01:00,Moment.js添加60分钟后时间未发生变化。
根因分析
这是夏令时(DST)时区回拨导致的问题。以欧洲多数时区(如英国GMT/BST)为例,2022年10月30日凌晨2点夏令时结束,系统时钟会回拨1小时至凌晨1点。当Moment.js使用本地时区解析2022-10-30 01:00并添加60分钟时,时间到达凌晨2点的瞬间触发时区回拨,最终实际时间又回到凌晨1点,因此输出结果未变化。
Moment.js默认采用运行环境的本地时区处理时间,若你的设备时区恰好存在这次夏令时切换,就会出现该现象。
解决方案
1. 改用UTC时间处理
若业务无需依赖本地时区,直接使用UTC模式解析和格式化:
var dateTimeFrom='2022-10-30 01:00' dateTimeFrom = moment.utc(dateTimeFrom).add(60, "minutes").format("YYYY-MM-DD HH:mm") console.log(dateTimeFrom) // 输出:2022-10-30 02:00
2. 指定固定时区
若需要特定时区的时间逻辑,引入moment-timezone并指定目标时区:
var dateTimeFrom='2022-10-30 01:00' // 指定UTC时区,避免夏令时影响 dateTimeFrom = moment.tz(dateTimeFrom, "UTC").add(60, "minutes").format("YYYY-MM-DD HH:mm") console.log(dateTimeFrom) // 输出:2022-10-30 02:00
3. 强制固定偏移量解析
保留本地时区但规避夏令时切换影响,可在解析时指定固定时区偏移:
var dateTimeFrom='2022-10-30 01:00' // 以UTC偏移量(+00:00)解析时间 dateTimeFrom = moment(dateTimeFrom + " +0000", "YYYY-MM-DD HH:mm Z").add(60, "minutes").format("YYYY-MM-DD HH:mm") console.log(dateTimeFrom) // 输出:2022-10-30 02:00
内容的提问来源于stack exchange,提问作者Nathan Moked
相关产品推荐
相关产品推荐

