JS 检查多个日期是否在范围内

JS Check if multiple dates are within range

我有以下代码,其中我有到达日期和离开日期并编辑它们的格式,以及禁用日期:

var aankomstDatum = "19-05-2018";
var parts = aankomstDatum.split('-');
aankomstDatumDate = new Date(parts[2],parts[1]-1,parts[0]);

vertrekDatum = "02-06-2018";
var parts2 = vertrekDatum.split('-');
vertrekDatumDate = new Date(parts2[2],parts2[1]-1,parts2[0]);

var aankomstDatumDateCheck = (aankomstDatumDate.getMonth() + 1) + '/' + aankomstDatumDate.getDate() + '/' +  aankomstDatumDate.getFullYear();
//alert(aankomstDatumDateCheck);

var vertrekDatumDateCheck = (vertrekDatumDate.getMonth() + 1) + '/' + vertrekDatumDate.getDate() + '/' +  vertrekDatumDate.getFullYear();
//alert(vertrekDatumDateCheck);

var disabledDates = "26-05-2018";
var partsdisabled = disabledDates.split('-');
var disableddatesDatumDate = new Date(partsdisabled[2], partsdisabled[1]-1, partsdisabled[0]); //alert(disableddatesDatumDate);

var disableddatesDatumDateCheck = (disableddatesDatumDate.getMonth() + 1) + '/' + disableddatesDatumDate.getDate() + '/' +  disableddatesDatumDate.getFullYear();
//alert(disableddatesDatumDateCheck);

if(dateCheck(aankomstDatumDateCheck,vertrekDatumDateCheck,disableddatesDatumDateCheck)) {
    console.log("Not available");
} else {
    console.log("Available");
}

function dateCheck() {
    return true;
}

基本上,如果禁用日期在到达日期和离开日期之间,则 if-else 会触发,而在其他情况下会触发 else。

此代码有效(万岁!),但我还没有做到。因为我计划将多个日期作为 var disabledDates 而这就是我遇到的问题。那么,如何编辑检查多个禁用日期的代码呢?

这是您的代码的简化版本,可以按您的要求运行。我认为在测试时 construct Date objects using ISO8601 格式化文本更好,即 "2018-05-19"(以 UTC 格式创建日期)。另请参阅答案末尾的提示。

点击代码下方的Run code snippet按钮查看控制台输出(比使用alert好很多):

var start = new Date("2018-05-19");
var end = new Date("2018-06-02");

var bookings = [
    new Date("2018-05-26"),
    new Date("2018-05-28")
];

if (validPeriod(start, end, bookings)) {
    console.log("no bookings found");
} else {
    console.log("found at least one booking");
}

function validPeriod(start, end, bookings) {
    var valid = true;

    for (var i = 0; i < bookings.length; i++) {
        var date = bookings[i];
        if (start <= date && date <= end) {
            valid = false;
            break;
        }
    }

    return valid;
}

小贴士

我强烈建议您使用 Moment.js 来处理日期。它会让你以后不再头疼。

如果您不选择 Moment.js,请记住,创建日期的方式取决于使用的时区,以及显示日期的计算机的时区,一个简单的方法是使用新的 Date(year, month, day, hours, minutes, seconds) 构造函数:

// for a browser/computer in timezone GMT+0200 (Paris)

// create a local date
new Date(2018, 5-1, 18).toString() // "Fri May 18 2018 00:00:00 GMT+0200 (CEST)"
new Date(2018, 5-1, 18).toISOString() // "2018-05-17T22:00:00.000Z"

// create a UTC date
new Date(Date.UTC(2018, 5-1, 18)).toString() // "Fri May 18 2018 02:00:00 GMT+0200 (CEST)"
new Date(Date.UTC(2018, 5-1, 18)).toISOString() // "2018-05-18T00:00:00.000Z"

// for a browser/computer in timezone GMT-0400 (New York)

// create a local date
new Date(2018, 5-1, 18).toString() // "Fri May 18 2018 00:00:00 GMT-0400 (EDT)"
new Date(2018, 5-1, 18).toISOString() // "2018-05-18T04:00:00.000Z"

// create a UTC date
new Date(Date.UTC(2018, 5-1, 18)).toString() // "Thu May 17 2018 20:00:00 GMT-0400 (EDT)"
new Date(Date.UTC(2018, 5-1, 18)).toISOString() // "2018-05-18T00:00:00.000Z"

但是当你为 Date 构造函数使用字符串时要小心,因为它在内部使用 Date.parse(dateString),有时它被解释为本地日期,有时被解释为 UTC:

// for a browser/computer in timezone GMT-0400 (New York)
new Date("08-19-2018"); // Sun Aug 19 2018 00:00:00 GMT-0400 (EDT) <-- local
new Date("08/19/2018"); // Sun Aug 19 2018 00:00:00 GMT-0400 (EDT) <-- local
new Date("2018-05-19"); // Fri May 18 2018 20:00:00 GMT-0400 (EDT) <-- UTC
new Date("2018/05/19"); // Sat May 19 2018 00:00:00 GMT-0400 (EDT) <-- local

添加到@djdavemark 的回答中,

您还可以在构建 some 函数中使用 JavaScript 来检查是否有任何日期落在给定范围内。

正如@RobG 提到的,对于某些浏览器,这些日期字符串可能会给出错误的结果,因此为了安全起见,您可以按照 Date constructor 接受的方式明确格式化。

来自@CMS 的回答问题:为什么Date.parse 给出了错误的结果?

function parseDate(input) {
  var parts = input.split('-');
  // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[2], parts[1]-1, parts[0]); // Note: months are 0-based
}  

var startData = parseDate("19-05-2018")
var endDate = parseDate("25-05-2018")

var dateSet = [
"20-05-2018",
"21-05-2018",
"22-05-2018"
];

var dateSet2 = [
"26-05-2018",
];

function inBetween(element, index, array) {
  return parseDate(element) >= startData && parseDate(element) <= endDate;
}

console.log(dateSet.some(inBetween))

console.log(dateSet2.some(inBetween))

这样看起来更优雅。

有关数组 some 方法的更多信息 MDN Docs