jQuery 日期选择器 d/m/yy 格式

jQuery DatePicker d/m/yy format

正在解决一个问题,dateFormat 的格式没有按预期工作。任何人都可以看到任何突出的东西吗?如果我将日期更改为不同的格式,它会起作用

var check_in = [["25/11/2021", "28/11/2021"]];

if ($(window).width() > 700) {
    $('#arrival, #contact-arrival').datepicker({
        minDate: '0M',
        numberOfMonths: 2,
        beforeShowDay: function(date) {
            var string = jQuery.datepicker.formatDate('d/m/yy', date);
            for (var i = 0; i < check_in.length; i++) {
              if (Array.isArray(check_in[i])) {
                var from = new Date(check_in[i][0]);
                var to = new Date(check_in[i][1]);
                var current = new Date(string);
                if (current >= from && current <= to) return false;
              }
            }
            return [check_in.indexOf(string) == -1]
          },
        dateFormat: 'dd M yy',
        onSelect: function (dateText, inst) {
            $('#departure, #contact-departure').datepicker("option", "minDate", dateText);
        }
    });

在上面的脚本中,jQuery.datepicker.formatDate('d/m/yy', date);没有识别var check_in = [["25/11/2021", "28/11/2021"]];

如果我将代码更改为 var string = jQuery.datepicker.formatDate('d/M/yy', date); 数组的格式为 var check_in = [["25/Nov/2021", "28/Nov/2021"]]; 一切正常,但正在以第一种格式提取数据 1/1/2021

希望有新眼光的人能看到我做错了什么。

非常感谢。

问题是您试图将 Date() 与它无法识别的字符串一起使用。 Date() accepts strings 喜欢 2011-10-10,但不喜欢 25/11/2021。我通过一些简单的 console.log()ing 证实了这一点,它显示了很多 Invalid date 错误。

因此您的 fromto 变量从未设置,并且针对它们的测试不起作用。问题根本不在 jQuery.datepicker.formatDate() 上(问题中的这个措辞让我感到困惑,需要一些修改才能理解你的意思)。

所以首先,我们需要以某种方式从这些字符串中生成日期。在 SO 上有很多关于如何将字符串解析为 JS 日期的示例(here's one), but jQueryUI's Datepicker has a handy utility for that built in: $.datepicker.parseDate。我们可以使用它来正确设置您的变量:

var from = $.datepicker.parseDate('dd/mm/yy', check_in[i][0]);
var to   = $.datepicker.parseDate('dd/mm/yy', check_in[i][1]);

我这样做并重新 运行 你的代码,但仍然出现 Invalid date 错误,特别是设置 current 的行。这遇到了完全相同的问题 - string 的格式 Date 无法理解。

但在修复之前,退一步 - 代码将日期对象 beforeShowDay() 作为参数 (date),将其转换为字符串 (string) ,然后将该字符串转换回日期 (current),并使用它与其他日期对象 (fromto) 进行比较。如果我们从一个日期开始,并想将它与日期进行比较,则不需要进行所有转换。我们可以完全摆脱 string,只使用 date.

还有最后一个问题 - string 仍在最后一次测试中使用:

return [check_in.indexOf(string) == -1]

我们不能在这里只使用 date 代替 string,因为它是一个 Date 对象,而 check_in 元素是字符串。所以我们确实需要将 date 转换为字符串以进行比较。

但再次退后一步,如果我正确理解了您的代码,则此测试是多余的。上面的代码已经检查了 check_in 运行ge 中的日期,并阻止了它们。其他一切都应该被允许,对吧?所以我们可以在这里简单地 return [true];?

这是应用了所有这些修复程序的简化的工作代码段。单击 运行 查看实际效果。

var check_in = [
  ["25/11/2021", "28/11/2021"]
];

$('#arrival').datepicker({
  minDate: '0M',
  numberOfMonths: 2,
  beforeShowDay: function(date) {

    for (var i = 0; i < check_in.length; i++) {
      if (Array.isArray(check_in[i])) {

        var from = $.datepicker.parseDate('dd/mm/yy', check_in[i][0]);
        var to = $.datepicker.parseDate('dd/mm/yy', check_in[i][1]);

        console.log(date, from, to);
        if (date >= from && date <= to) return [false];
      }
    }
    return [true];
  },
  dateFormat: 'dd M yy',
});
<link href="https://code.jquery.com/ui/1.13.0-alpha.1/themes/smoothness/jquery-ui.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">
</script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>

<div id="arrival"></div>