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

时间:2018-01-23 15:51:25

标签: javascript arrays date for-loop date-range

我有以下代码,我有到达日期和出发日期,并编辑他们的格式,以及禁用日期:

Jan 23, 2018 9:18:34 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
Title is : Google
PASSED: test1

===============================================
    Default test
    Tests run: 1, Failures: 0, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

基本上,如果禁用日期在到达日期和出发日期之间,则if else会触发,而在另一种情况下则为else。

此代码有效(万岁!),但我还没有。因为我计划将多个日期作为var disabledDates,这就是我被困的地方。那么,如何编辑检查多个禁用日期的代码?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

单击代码下方的Run code snippet按钮以查看控制台输出(比使用警报要好得多):

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,请记住,根据您创建日期的方式,将取决于您使用的时区,并根据您的计算机的时区显示哪个日期,一个简单的方法是使用新的日期(年,月,日,小时,分钟,秒)构造函数:

// 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

答案 1 :(得分:1)

添加@djdavemark的答案,

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

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

来自@ CMS的回答Question: Why does Date.parse give incorrect results?

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

的详细信息
相关问题