我有以下代码,我有到达日期和出发日期,并编辑他们的格式,以及禁用日期:
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,这就是我被困的地方。那么,如何编辑检查多个禁用日期的代码?
谢谢!
答案 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