如何用jQuery验证日期是否在两日期之间?求指出代码错误
日期范围检查代码的问题分析与修正方案
我来帮你梳理下代码里的几个关键问题,然后给出可运行的修正版本:
核心错误点
日期类型混淆导致逻辑失效:
你用jQuery.datepicker.formatDate把fDate和lDate转成了字符串,但cDate是通过parseDate得到的Date对象。字符串和Date对象直接比较会触发JS的隐式类型转换,结果完全不符合日期大小的判断逻辑。更糟的是,lDate变成字符串后,调用lDate.setDate()会直接报错——字符串根本没有这个方法!输入日期格式不匹配:
表单里的<input type="date">返回的value是ISO标准格式(yyyy-mm-dd),但你用dd-mm-yy去解析,这会让parseDate直接失败返回null,后续的日期比较自然完全失效。
修正后的代码
<script src="http://code.jquery.com/jquery-1.9.1.js"></script> <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script> <script> function dateCheck() { var fDate, lDate, cDate; // 获取当前日期,并重置时分秒为0,避免当天晚些时候的日期被误判 fDate = new Date(); fDate.setHours(0, 0, 0, 0); // 解析表单输入的日期:匹配input type="date"的yyyy-mm-dd格式 try { cDate = jQuery.datepicker.parseDate('yy-mm-dd', jQuery('#challenge_date').val()); // 同样重置时分秒,确保日期比较的准确性 cDate.setHours(0, 0, 0, 0); } catch(e) { alert("请输入有效的日期"); return false; } // 计算7天后的日期,同样重置时分秒 lDate = new Date(); lDate.setHours(0, 0, 0, 0); lDate.setDate(lDate.getDate() + 7); // 直接比较Date对象(本质是比较时间戳) if(cDate <= lDate && cDate >= fDate) { alert("true"); return true; } alert("false"); return false; } </script> <form action="#" method="post" onsubmit="return dateCheck()"> <input type="date" name="challenge_date" id="challenge_date"> <input type="submit" value="check"> </form>
关键修正说明
- 统一使用Date对象:所有日期变量都保持Date类型,直接比较即可(JS中Date对象的比较会自动转换为时间戳的数值比较)
- 重置时分秒:避免当前时间是当天下午,而用户选择当天凌晨的日期时被误判为“不在范围内”
- 匹配输入格式:用
yy-mm-dd解析input type="date"的输出,保证解析成功 - 增加错误捕获:通过try-catch处理用户输入无效日期的情况,提升体验
内容的提问来源于stack exchange,提问作者Mike van den Hoek
相关产品推荐
相关产品推荐

