繁体   English   中英

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 而这就是我被卡住的地方。 那么,如何编辑检查多个禁用日期的代码?

这是您的代码的简化版本,可以按您的要求工作。 我认为最好在测试时使用 ISO8601格式的文本构造 Date 对象,即"2018-05-19" (它在 UTC 中创建日期)。 另请参阅答案末尾的提示。

单击Run code snippet下方的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

添加到@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM