JavaScript日期转换函数失效:gen.02,2023转2023-01-02返回NaN-NaN-NaN
问题解决:意大利语日期格式转换失败返回NaN-NaN-NaN
问题原因
你的函数返回NaN-NaN-NaN,核心原因是原生JavaScript的Date构造函数无法识别意大利语的月份缩写(比如gen.是意大利语一月的缩写)。当执行new Date('gen. 02, 2023')时,得到的是无效日期对象,调用getMonth()、getDate()、getFullYear()这些方法都会返回NaN,最终拼接出错误结果。
解决方案
你需要先将意大利语的月份缩写映射为可识别的格式,再进行日期处理。以下是两种可靠的实现方式:
方式一:手动解析日期字符串(推荐,无需依赖Date构造函数)
直接拆分输入字符串,通过预设的月份映射表转换格式:
function formatDate(dateStr) { // 意大利语月份缩写 -> 两位数字的映射 const itMonthMap = { 'gen.': '01', 'feb.': '02', 'mar.': '03', 'apr.': '04', 'mag.': '05', 'giu.': '06', 'lug.': '07', 'ago.': '08', 'set.': '09', 'ott.': '10', 'nov.': '11', 'dic.': '12' }; // 拆分日期字符串,过滤空内容 const [monthAbbr, day, year] = dateStr.split(/[\s,]+/).filter(Boolean); // 补全日期为两位,拼接成目标格式 return `${year}-${itMonthMap[monthAbbr]}-${day.padStart(2, '0')}`; }
方式二:转换为英文月份后用Date构造函数处理
先把意大利语月份替换成英文缩写,让Date能正常解析:
function formatDate(dateStr) { // 意大利语月份 -> 英文月份的映射 const itToEnMonths = { 'gen.': 'Jan', 'feb.': 'Feb', 'mar.': 'Mar', 'apr.': 'Apr', 'mag.': 'May', 'giu.': 'Jun', 'lug.': 'Jul', 'ago.': 'Aug', 'set.': 'Sep', 'ott.': 'Oct', 'nov.': 'Nov', 'dic.': 'Dec' }; // 替换意大利语月份为英文 const enDateStr = dateStr.replace(/gen\.|feb\.|mar\.|apr\.|mag\.|giu\.|lug\.|ago\.|set\.|ott\.|nov\.|dic\./, match => itToEnMonths[match]); const d = new Date(enDateStr); // 校验日期有效性 if (isNaN(d.getTime())) { throw new Error('输入的日期格式无效'); } // 补全月份和日期为两位 const month = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); const year = d.getFullYear(); return `${year}-${month}-${day}`; }
测试调用:
console.log(formatDate('gen. 02, 2023')); // 输出:2023-01-02
内容的提问来源于stack exchange,提问作者Francesco Gangi
相关产品推荐
相关产品推荐

