为何moment.add方法返回值异常?给月初日期加1月结果不符预期
问题分析与解决:moment.add加1个月得到非预期日期
问题原因
你在代码里把moment对象转为字符串后,又通过new Date(monthID)转回Date对象,这一步会引入时区偏移问题。
比如初始的monthID是2023-05-01(UTC时间),当你用new Date('2023-05-01')创建Date对象时,浏览器/Node.js会把它解析成本地时区的2023-05-01 00:00:00,对应的UTC时间其实是2023-04-30T16:00:00Z(假设本地时区是UTC+8)。这时调用add(1, 'M'),会给UTC时间2023-04-30T16:00:00Z加1个月,得到2023-05-30T16:00:00Z,再转成本地日期就是2023-05-30,和你看到的结果一致。
解决方案
不要来回转换moment对象、字符串和Date,直接在moment对象上完成所有操作,避免时区干扰:
const moment = require('moment'); const availableDate = "2023-05-07T00:00:00Z"; // 直接基于moment对象操作,不转字符串 let monthMoment = moment(availableDate).startOf('M'); console.log('Month: ', monthMoment.format('YYYY-MM-DD')); // 加1个月后,再调用startOf('M')确保回到月初 monthMoment = monthMoment.add(1, 'M').startOf('M'); console.log('Month after the add: ', monthMoment.format('YYYY-MM-DD'));
如果因为业务需求必须处理字符串,要始终使用UTC模式创建moment对象,避免本地时区影响:
const moment = require('moment'); const availableDate = "2023-05-07T00:00:00Z"; let monthID = moment.utc(availableDate).startOf('M').format('YYYY-MM-DD'); console.log('Month: ', monthID); // 用moment.utc()解析字符串,保持UTC时区 monthID = moment.utc(monthID).add(1, 'M').startOf('M').format('YYYY-MM-DD'); console.log('Month after the add: ', monthID);
以上两种方式都会输出预期的2023-06-01。
内容的提问来源于stack exchange,提问作者NikP
相关产品推荐
相关产品推荐

