如何修复YYMMDD格式(日期为00)字符串转有效日期的代码问题
问题分析
你的代码异常根源在于对Date构造函数的参数逻辑理解有误:
Date的月份参数是0-based(0=1月,1=2月…11=12月),你直接传入字符串解析后的月份数字(比如"01"→1,对应2月),导致月份偏移。- 当传入
day=0时,Date会返回传入月份的前一个月最后一天,但你的逻辑是把输入的MM直接作为目标月份,导致1月的00日被错误解析为当年1月的最后一天,而非去年12月的最后一天。
比如输入"240100"时,原代码执行new Date(2024, 1, 0),得到的是2024年1月31日(因为1对应2月,day=0取2月的前一个月最后一天),而非预期的2023年12月31日。
解决方案
调整逻辑:当DD=00时,先构造输入MM月份的第一天,再减去1天,即可得到前一个月的最后一天。这种方式能自动处理跨年、闰年等边界情况。
修正后的代码:
function formatDate(stringDate) { // 解析日期组件为数字 const year = parseInt(stringDate.substring(0, 2), 10); const month = parseInt(stringDate.substring(2, 4), 10); // 1-12 const day = parseInt(stringDate.substring(4, 6), 10); let targetDate; if (day === 0) { // 构造目标月份的第一天,再减1天得到上月最后一天 targetDate = new Date(2000 + year, month - 1, 1); targetDate.setDate(targetDate.getDate() - 1); } else { // 正常日期处理,注意月份转成0-based targetDate = new Date(2000 + year, month - 1, day); } // 格式化为MM/DD/YYYY(保持与你示例一致的无补0格式) const formattedMonth = targetDate.getMonth() + 1; const formattedDay = targetDate.getDate(); const formattedYear = targetDate.getFullYear(); const formattedDate = `${formattedMonth}/${formattedDay}/${formattedYear}`; console.log(formattedDate); return formattedDate; }
测试验证
- 输入
"240800"→ 输出7/31/2024(符合预期) - 输入
"240100"→ 输出12/31/2023(正确处理跨年) - 输入
"240200"→ 输出1/31/2024(正确处理平/闰年) - 输入
"240300"→ 输出2/29/2024(正确识别2024是闰年)
内容的提问来源于stack exchange,提问作者Sicnarf
相关产品推荐
相关产品推荐

