Moment.js转换未来日期时年份错误(2050变为1950)求助
解决Moment.js解析DD/MM/YYYY格式日期时年份错误的问题
这个问题我太熟悉了!你遇到的核心问题是Moment.js默认会把日期字符串当成MM/DD/YYYY格式来解析,但你的输入其实是DD/MM/YYYY——21作为月份显然不合法(月份范围是1-12),所以解析逻辑出错,最后把年份错误地转换成1950了(这是JavaScript Date对象处理异常日期的遗留问题,两位数年份会默认归到19xx区间)。
正确的处理方式:明确指定输入格式
你必须告诉Moment.js你的输入日期的具体格式,而不是让它自动猜测。针对你DD/MM/YYYY HH:mm的输入格式,修改后的代码如下:
- 解析并转为UTC格式:
moment(item["End Date"], "DD/MM/YYYY HH:mm").utc().format();
- 解析并格式化为指定输出格式:
moment(item["Start Date"], "DD/MM/YYYY HH:mm").format('MM/DD/YYYY HH:mm');
- 如果需要先转为Date对象再处理:
// 先按正确格式解析,再转成Date对象 const startDate = moment(item["Start Date"], "DD/MM/YYYY HH:mm").toDate(); // 之后再格式化 moment(startDate).format('MM/DD/YYYY HH:mm');
为什么之前的写法会失败?
你之前的几种写法都没有指定输入格式,Moment会尝试自动解析日期:
- 当它看到
21/01/2050时,会默认把第一个数字段当成月份(MM),但21不是合法月份,解析逻辑就会异常,进而触发JavaScript Date的容错机制,把年份错误地处理成1950。
额外提示:兼容多种输入格式
如果你的系统可能同时接收DD/MM/YYYY HH:mm和MM/DD/YYYY HH:mm两种格式的日期,可以传入多个格式参数让Moment尝试匹配:
moment(item["Start Date"], ["DD/MM/YYYY HH:mm", "MM/DD/YYYY HH:mm"]).format('MM/DD/YYYY HH:mm');
不过如果你的输入格式是固定的,只传单一格式会更稳妥,避免歧义。
内容的提问来源于stack exchange,提问作者Ashwini Maddala
相关产品推荐
相关产品推荐

