jQuery中dd/MM/yyyy格式日期比较逻辑异常及Invalid Date问题求助
问题背景
我在做jQuery前端开发时,碰到了两个和日期相关的头疼问题:一是按dd/MM/yyyy格式比较日期时逻辑完全混乱——明明journal日期比当前日期小,却还是触发了错误提示;二是尝试用原生Date对象转换dd/MM/yyyy格式的日期字符串时,直接出现了"Invalid Date"的错误。
先把第一个问题的场景说清楚:我要实现的逻辑其实很简单:
- 当用户选择的journal日期(
dd/MM/yyyy格式)大于当前日期时,弹出错误提示; - 当journal日期小于当前日期时,正常执行后续流程。
但实际运行时完全不对,比如:
- 当前日期格式化后是
09/01/2025(按dd/MM/yyyy就是2025年1月9日); - 用户选的journal日期是
31/12/2024(2024年12月31日)。
这个journal日期明明比当前日期小,可代码还是触发了错误提示,直接走进了if判断块里。
我最开始写的代码是直接比较格式化后的日期字符串,结果踩了大坑:
function formatCurrentDate() { let currentDate = new Date(); let month = String(currentDate.getMonth() + 1).padStart(2, '0'); // 月份是0开始的,要加1 let day = String(currentDate.getDate()).padStart(2, '0'); let year = currentDate.getFullYear(); return `${day}/${month}/${year}`; } let currentDateFormatted = formatCurrentDate(); // 比如返回 09/01/2025 (dd/MM/yyyy) let pJournalDate = $("#txt_journal_date").val(); // 比如是 31/12/2024 (dd/MM/yyyy) if (pJournalDate > currentDateFormatted) { ModelSuccessDanger( MYLang.ReturnLang() === "ar-KW" ? 'عفوا !!' : 'Warning !!', MYLang.ReturnLang() === "ar-KW" ? "يجب ان لا يكون تاريخ الغلق اكبر من تاريخ اليوم" : "You should specify a date for closing that is not greater than the current date", '0', null ); return false; }
后来我想改用Date对象来比较,结果又遇到新问题:比如用户输入的日期是23/01/2025,执行new Date(inputDate)直接返回"Invalid Date",根本没法用。我需要一个通用的解决方案,不管是什么dd/MM/yyyy格式的日期,都能和当前日期正确比较,还不会出转换错误。
问题原因分析
1. 直接比较日期字符串的坑
直接对比dd/MM/yyyy格式的字符串,本质是按字符的ASCII码顺序逐位比,不是按实际日期大小比。比如31/12/2024和09/01/2025:第一个字符3的ASCII码比0大,所以字符串比较会认为31/12/2024 > 09/01/2025,但实际这个日期是更小的,直接导致逻辑完全反转。
2. 原生Date对象不支持解析dd/MM/yyyy
原生Date对象默认只认MM/dd/yyyy或者ISO格式yyyy-MM-dd的字符串,直接传入dd/MM/yyyy格式的内容,它识别不了,自然就返回无效日期了。
解决方法
这里给两种通用的解决方案,都能同时解决这两个问题:
方法1:手动解析日期字符串,构建Date对象后再比较
写一个工具函数,把dd/MM/yyyy格式的字符串拆分成日、月、年,再传入Date构造函数(注意:Date的月份是0-based,所以要减1),然后直接比较两个Date对象的大小:
// 把dd/MM/yyyy格式的字符串转成Date对象 function parseDDMMYYYY(dateStr) { const [day, month, year] = dateStr.split('/'); // 月份减1,因为Date的月份是0-11 return new Date(year, month - 1, day); } // 处理日期验证的主函数 function validateJournalDate() { // 获取当前日期,把时分秒设为0,避免时间部分影响日期比较 const currentDate = new Date(); currentDate.setHours(0, 0, 0, 0); // 获取用户输入的日期字符串 const journalDateStr = $("#txt_journal_date").val(); // 转成Date对象 const journalDate = parseDDMMYYYY(journalDateStr); // 先判断日期是否有效 if (isNaN(journalDate.getTime())) { alert("请输入有效的日期(格式为dd/MM/yyyy)"); return false; } // 比较两个Date对象的大小 if (journalDate > currentDate) { ModelSuccessDanger( MYLang.ReturnLang() === "ar-KW" ? 'عفوا !!' : 'Warning !!', MYLang.ReturnLang() === "ar-KW" ? "يجب ان لا يكون تاريخ الغلق اكبر من تاريخ اليوم" : "You should specify a date for closing that is not greater than the current date", '0', null ); return false; } // 日期符合要求,继续执行后续逻辑 return true; }
方法2:转成ISO格式字符串再比较
如果不想用Date对象,也可以把dd/MM/yyyy转成yyyy-MM-dd的ISO格式字符串,这种格式的字符串可以直接按字符顺序比较,结果和实际日期大小一致:
// 把dd/MM/yyyy转成yyyy-MM-dd格式 function convertToISOFormat(dateStr) { const [day, month, year] = dateStr.split('/'); return `${year}-${month}-${day}`; } // 处理日期验证的主函数 function validateJournalDate() { // 获取当前日期的ISO格式字符串(只取日期部分) const currentISO = new Date().toISOString().split('T')[0]; // 获取用户输入的日期并转成ISO格式 const journalDateStr = $("#txt_journal_date").val(); const journalISO = convertToISOFormat(journalDateStr); // 比较ISO格式的字符串 if (journalISO > currentISO) { ModelSuccessDanger( MYLang.ReturnLang() === "ar-KW" ? 'عفوا !!' : 'Warning !!', MYLang.ReturnLang() === "ar-KW" ? "يجب ان لا يكون تاريخ الغلق اكبر من تاريخ اليوم" : "You should specify a date for closing that is not greater than the current date", '0', null ); return false; } // 日期符合要求,继续执行后续逻辑 return true; }
验证效果
用之前的异常场景测试:
- 当前日期是2025年1月9日,ISO格式是
2025-01-09; - journal日期是2024年12月31日,ISO格式是
2024-12-31; - 比较
2024-12-31 > 2025-01-09结果为false,不会触发错误,完全符合预期。
如果journal日期是10/01/2025(2025年1月10日),转成ISO格式是2025-01-10,比当前日期大,就会触发错误,完美匹配需求。
备注:内容来源于stack exchange,提问作者ahmed salah abd elaziz elbarba

