很抱歉这个问题太长,但您需要了解一些背景知识才能完全理解:
我正在 Drupal 7 中构建一个事件调度程序,它允许用户选中一个复选框以将事件添加到他们的日程表中......这很困惑。复选框包含一个类似于 1404915600 - 1404917400
的值。代表10:30am - 10:50am
这是使用 PHP strtotime();
的结果功能如下 strtotime("10:30am");
我需要即时检查用户是否选中与先前选择的事件重叠时间的另一个框,并在存在重叠时触发错误。
目前,我正在使用上面提到的 php 函数在复选框中创建值,然后在单击复选框时将这些值传递给 JavaScript 数组。 id
复选框的 是所选事件的 url 友好名称,它充当数组键,值是所选时间,因此数组最终如下所示:
timeArr = { event-name-one: 0: 1404915600, 1: 1404917400 }
每个事件都有自己的 key ,可以使用 Javascript 简化删除(或取消安排)事件 delete
功能。
以下是获取复选框 ID 和关联时间并将它们存储在数组中的完整代码:
var timeBox = jQuery('input[type="checkbox"].time, input[type="checkbox"].time2');
var timeArr = [];
// Listen for checkbox change
timeBox.bind('click', function() {
var eventID = jQuery(this).attr('id');
// If Checkbox IS checked
if(jQuery(this).prop('checked')) {
var timeStamp = jQuery(this).val();
var newTime = timeStamp.split(" - ");
// If timeArr has been set
if(timeArr.length > 1) {
for(key in timeArr) {
if(newTime[0] > timeArr[key][0] && newTime[0] < timeArr[key][1] || timeArr[key][0] > newTime[0] && timeArr[key][0] < newTime[1]) {
alert("Overlap!");
return false;
} else {
timeArr[eventID].push(newTime);
console.log(timeArr);
}
}
} else {
// else timeArr hasn't been set -- so set it!
timeArr[eventID] = newTime;
console.log(timeArr);
}
} else {
delete timeArr[eventID];
}
});
我似乎无法让新选择的事件时间与数组中的当前时间进行交叉检查。它们只是附加到 timeArr
数组就像检查通过一样。
我是否以完全错误的方式处理这个问题,或者我只是错过了一些东西?我尝试过很多不同的事情,但我完全不知道哪个是正确的方向。我正在使用 Drupal 7(如果有帮助的话)。
最佳答案
公式为start1 < end2 && end1 > start2
。这将检测所需的所有 4 个比较中的重叠(如下)。您还需要确定确切的开始和结束时间是包含的还是排除的。 IE。如果某些内容以 1000 结束,而其他内容以 1000 开始,那么它们在这 1000 分钟内是否重叠?
重叠的四个条件是:
- 事件 1 与事件 2 的开始时间重叠(事件 1:上午 10 点至上午 12 点,事件 2:上午 11 点至下午 1 点)
- 事件 1 与事件 2 的结束时间重叠(事件 1:上午 10 点至上午 12 点,事件 2:上午 9 点至上午 11 点)
- 事件 1 完全包含事件 2(事件 1:上午 10 点至上午 12 点,事件 2:上午 1030 点至上午 1130 点)
- 事件 2 完全包含事件 1(事件 1:上午 10 点至上午 12 点,事件 2:上午 9 点至下午 1 点)
上面的公式涵盖了所有 4 种可能的情况。
关于javascript - 检查时间范围是否重叠,如果为真则触发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24662735/