
本文介绍在 day.js 中实现严格日期解析(防止日期溢出)的同时,保持对单数字和双数字日期格式(如“3-12-2023”和“03-12-2023”)的兼容性,避免因启用 strict 模式导致合法简写格式被误判为无效。
本文介绍在 day.js 中实现严格日期解析(防止日期溢出)的同时,保持对单数字和双数字日期格式(如“3-12-2023”和“03-12-2023”)的兼容性,避免因启用 strict 模式导致合法简写格式被误判为无效。
在使用 Day.js 解析用户输入的日期字符串时,一个常见痛点是:既要阻止非法溢出(例如 32-12-2023 被错误解析为 2024-01-01),又要允许自然书写的灵活格式(如 3-12-2023 16:00 而非强制要求 03-12-2023 16:00)。单纯启用 strict: true(即第三个参数为 true)虽可禁用溢出校正,但会因格式字面量严格匹配而拒绝缺失前导零的合法日期。
解决方案:传入格式数组 + strict 模式
Day.js 支持将 format 参数设为字符串数组,它会依次尝试每个格式进行解析,只要任一格式匹配且通过严格校验,即返回有效 Dayjs 实例;全部失败才返回无效对象。这正是兼顾「严格性」与「灵活性」的关键:
import dayjs from 'dayjs';
// ✅ 正确:支持 d-mm-yyyy 和 dd-mm-yyyy 两种日格式
const parseDate = (input) => {
return dayjs(input, ['D-MM-YYYY HH:mm', 'DD-MM-YYYY HH:mm'], true);
};
console.log(parseDate('3-12-2023 16:00').isValid()); // true
console.log(parseDate('03-12-2023 16:00').isValid()); // true
console.log(parseDate('32-12-2023 16:00').isValid()); // false(溢出被拦截)
console.log(parseDate('15-13-2023 16:00').isValid()); // false(月份越界)⚠️ 注意事项:
- 格式中请使用大写
D(表示 1–31 的日)和DD(表示 01–31 的双位日),小写d表示星期几(易混淆,应避免); - 时间部分建议统一用
HH:mm(24 小时制),若需支持HH:mm:ss,可扩展格式数组,如['D-MM-YYYY HH:mm', 'D-MM-YYYY HH:mm:ss', 'DD-MM-YYYY HH:mm', ...]; - 不要遗漏
true作为第三个参数,否则 strict 模式不生效,溢出仍会被自动修正; - 若项目中大量使用该逻辑,建议封装为可复用的解析函数,并配合自定义错误提示提升用户体验。
总结:通过向 dayjs(date, formatArray, true) 传入多格式数组,你无需牺牲用户体验即可实现工业级的日期输入校验——既堵住 32-12-2023 这类数据漏洞,又保留对人性化输入格式的友好支持。


















