检查时间范围是否重叠,如果为真则触发错误

时间:2014-07-09 19:57:21

标签: javascript php jquery arrays checkbox

很抱歉这个问题的篇幅很长,但您需要了解一些背景知识才能完全理解:

我正在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 }

每个事件都有自己的密钥,可以使用Javascripts 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,如果有帮助的话。

1 个答案:

答案 0 :(得分:1)

公式为start1 < end2 && end1 > start2。这将检测所需的所有4个比较中的重叠(下图)。您还需要确定确切的开始和结束时间是包含还是排除。 I.E.如果一些东西在1000结束而其他东西从1000开始,那么它们是否会重叠1000分钟呢?

重叠的四个条件是:

  1. Event1与Event2的开头重叠(事件1:上午10点至凌晨12点,事件2:上午11点至下午1点)
  2. Event1与Event2的结尾重叠(事件1:上午10点至凌晨12点,事件2:上午9点至上午11点)
  3. Event1完全包含Event2(事件1:上午10点至凌晨12点,事件2:上午10点30分至11点30分)
  4. Event2完全包含Event1(事件1:上午10点至凌晨12点,事件2:上午9点至下午1点)
  5. 上述公式涵盖了所有4种可能的情况。