JavaScript如何实现支持短格式、无前置零的字符串转Date对象方法?
实现方案
你原来的实现是按固定位置截取固定长度的字符,所以没办法适配无前导零的单数字月/日,也不支持短格式标识,我们可以改成按分隔符拆分后按顺序匹配的思路实现,完整代码如下:
const parse = (val, fmt) => { if (!val || !fmt) return; // 格式映射,兼容大小写、长短格式标识 const fmtMap = { y: 'year', Y: 'year', m: 'month', M: 'month', d: 'day', D: 'day' }; // 拆分格式和输入值,过滤空项 const fmtParts = fmt.split(/[^yYmMdD]/).filter(Boolean); const valParts = val.split(/\D/).filter(Boolean).map(Number); if (fmtParts.length !== valParts.length) return; const dateInfo = { year: 0, month: 0, day: 0 }; fmtParts.forEach((part, idx) => { const type = fmtMap[part[0]]; dateInfo[type] = valParts[idx]; }); // 2位年份兼容逻辑,阈值可根据业务需求调整 if (dateInfo.year < 100) { dateInfo.year += dateInfo.year > 50 ? 1900 : 2000; } return new Date(dateInfo.year, dateInfo.month - 1, dateInfo.day); };
测试验证
// 原有长格式用例完全兼容 console.log(parse('05/11/1896', 'DD/MM/YYYY')); // 1896-11-05 console.log(parse('07-12-2000', 'DD-MM-YYYY')); // 2000-12-07 // 新特性支持 console.log(parse('5/5/2021', 'd/m/y')); // 2021-05-05 console.log(parse('2023-6-9', 'yyyy-m-d')); // 2023-06-09 console.log(parse('9/8/99', 'm/d/y')); // 1999-09-08 console.log(parse('10/5/23', 'd/m/y')); // 2023-05-10
支持特性
- 兼容任意非数字分隔符,/、-、:、空格都可自动识别
- 适配长短格式标识,
YYYY/yy/y、MM/m、DD/d均支持,大小写不敏感 - 自动处理无前导零的月/日,无需额外配置
- 自带2位年份兼容逻辑,可按需调整年份阈值
内容的提问来源于stack exchange,提问作者live627
相关产品推荐
相关产品推荐

