jQuery DatePicker使用d/m/yy格式无法匹配日期数组问题排查
问题根源
原生Date构造函数解析dd/mm/yyyy格式的字符串时,默认会把第一位数字识别为月份、第二位识别为日期,比如25/11/2021会被识别为第25个月,最终生成无效日期,导致你的区间判断逻辑完全失效。而你换成d/M/yy格式后日期能被正确识别,是因为月份缩写的格式不会触发解析歧义。
另外原代码中check_in.indexOf(string)属于无效逻辑,check_in是二维数组,无法通过indexOf匹配单个日期字符串,该判断永远返回-1没有实际作用。
修复方案
你不需要修改数据源格式,只需要手动解析dd/mm/yyyy格式的日期字符串即可,修改后的代码如下:
var check_in = [["25/11/2021", "28/11/2021"]]; // 新增工具函数:解析dd/mm/yyyy格式为合法Date对象 function parseDMY(dmyStr) { var parts = dmyStr.split('/'); // 注意月份要减1,JS月份从0开始计数 return new Date(parts[2], parts[1] - 1, parts[0]); } if ($(window).width() > 700) { // 提前预解析所有禁用区间的日期,避免每次渲染日历重复计算 var disableRanges = check_in.map(function(range) { return { from: parseDMY(range[0]), to: parseDMY(range[1]) } }); $('#arrival, #contact-arrival').datepicker({ minDate: '0M', numberOfMonths: 2, beforeShowDay: function(date) { // 直接用传入的date对象判断,不需要额外转格式再转Date for (var i = 0; i < disableRanges.length; i++) { var range = disableRanges[i]; if (date >= range.from && date <= range.to) { return [false]; } } return [true]; }, dateFormat: 'dd M yy', onSelect: function (dateText, inst) { $('#departure, #contact-departure').datepicker("option", "minDate", dateText); } }); }
优化说明
- 新增的
parseDMY工具函数会主动按日/月/年的顺序拆分字符串生成日期,不会出现解析歧义 - 提前预解析所有禁用区间的日期,不用每次日历渲染日期的时候重复解析字符串,性能更好
- 去掉了不必要的日期转字符串再转Date的冗余逻辑,直接用datepicker传入的原生Date对象做判断,准确性更高
内容的提问来源于stack exchange,提问作者Adam Huddleston
相关产品推荐
相关产品推荐

