You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:18:03