使用JavaScript提取并解析字符串日期时遇到格式化异常问题
问题根源与解决方案
你的问题出在日期解析环节:JavaScript原生Date构造函数无法直接识别dd-mm-yyyy格式的字符串,调用new Date(cDate)会得到无效的Date对象,后续调用getDate()、getMonth()等方法都会返回NaN,最终导致formatDate输出NaN-NaN-NaN。
修正步骤
- 手动拆分日期分量:将提取到的
cDate按-分割,重新整理为Date构造函数能识别的参数顺序(年、月、日,注意月份是0基索引,要减1)。 - 确保初始日期有效:用拆分后的分量创建
Date对象,避免自动解析失败。 - 保留原有逻辑的结束日期计算:
Date构造函数会自动处理跨月/跨年的边界情况(比如31-01-2023的下月同日会自动调整为28/29-02-2023)。
修正后的完整代码
var cDate = dText.match(/\d{2}-\d{2}-\d{4}/)[0]; console.log(cDate); // 拆分dd-mm-yyyy格式的日期,转换为Date构造函数需要的参数 const [day, month, year] = cDate.split('-').map(Number); let initialStartDate = new Date(year, month - 1, day); // 计算结束日期:下月同日 let initialEndDate = new Date(year, month, day); startDateString = formatDate(initialStartDate); endDateString = formatDate(initialEndDate); $("#startDateF").data("initialValue", startDateString); $("#endDateF").data("initialValue", endDateString); function formatDate(date) { let day = ("0" + date.getDate()).slice(-2); let month = ("0" + (date.getMonth() + 1)).slice(-2); let year = date.getFullYear(); return day + "-" + month + "-" + year; }
验证示例
当cDate = 16-04-2023时:
initialStartDate会被正确解析为2023年4月16日,格式化后输出16-04-2023initialEndDate为2023年5月16日,格式化后输出16-05-2023,完全符合预期。
内容的提问来源于stack exchange,提问作者jessiepinkman
相关产品推荐
相关产品推荐

