JavaScript转换DD.MM.YYYY格式日期为ISO格式时日期减1如何解决
问题根因
出现日期少一天的核心原因是时区解析不一致:
- 你将日期转成
MM-DD-YYYY格式字符串后传给new Date()时,运行环境会按照本地时区解析这个日期,而非UTC时区 - 后续调用
setUTCHours(0,0,0,0)是修改UTC时区的时分秒,若你的本地时区早于UTC(比如国内为东八区,比UTC快8小时),本地时间的2021-07-19 00:00对应的UTC时间为2021-07-18 16:00,此时将UTC时间的时分秒设为0,自然就得到了18号的UTC日期。
最优解决方案
既然你已经引入了Moment.js做日期处理,完全不需要绕多层Date转换的逻辑,直接用Moment的原生API即可一步得到符合预期的结果:
// 直接解析原始DD.MM.YYYY格式的日期,按UTC时区取当天零点,输出ISO格式 moment("19.07.2021", 'DD.MM.YYYY').utc().startOf('day').toISOString()
输出结果为2021-07-19T00:00:00.000Z,完全符合你的需求。
调整原有逻辑的方案
如果你不想修改原有转换流程,也可以调整Date操作的逻辑避免时区差问题:
const date = new Date(this.stringToStringDateFormat("19.07.2021")); date.setHours(0,0,0,0); new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())).toISOString();
不过这种写法冗余性很高,更推荐直接用Moment的方案。
内容的提问来源于stack exchange,提问作者R0b0t0
相关产品推荐
相关产品推荐

