时间重叠问题javascript

时间:2014-01-23 10:23:14

标签: javascript jquery html json html5

我正在我的项目中添加任务模块。我想检查每次任务添加检查现有任务是否重叠。我几乎做了但是,一个问题发生在时间重叠条件不允许添加任务,例如如果用户添加任务低于以下时间如下:

  

09:00 AM - 10:00 AM

     

上午10:30 - 上午11:00

如果我在上午10:00到10:30之间添加任务,我的情况不允许在下面:

function disabletime(start_time, end_time) {
    var start_date = new Date(new Date(start_time).getTime());
    var end_date = new Date(new Date(end_time).getTime());

    var disable_times = new Array();
    var max_date = 0;
    var min_date = 0;

    if (tasks_array.length > 0) {
        for (var i = 0; i < tasks_array.length; i++) {

            var prev_s_date = Date.parse("1-1-2000 " + tasks_array[i].start_time);
            var prev_e_date = Date.parse("1-1-2000 " + tasks_array[i].end_time);
            var prev_start_date = new Date(new Date(prev_s_date).getTime());
            var prev_end_date = new Date(new Date(prev_e_date).getTime());
            if (i == 0) {
                min_date = prev_start_date.getTime();
                max_date = prev_end_date.getTime();
            } else {

                if (prev_end_date.getTime() > max_date) {
                    max_date = prev_end_date.getTime();
                }

                if (prev_start_date.getTime() < min_date) {
                    min_date = prev_start_date.getTime();
                }
            }
        }
        if ((start_date.getTime() == min_date) && (end_date.getTime() == max_date)) {
            alert("Check the start and end time for this task!");
            return false;
        } else if ((start_date.getTime() < min_date) && (end_date.getTime() <= min_date) || (start_date.getTime() >= max_date) && (end_date.getTime() > max_date)) {

        } else {
            alert("Check the start and end time for this task!");
            return false;

        }
    }
    start_date = new Date(start_date.getTime() + 30 * 60000);
    while (start_date < end_date) {
        disable_times.push([start_date.getHours(), start_date.getMinutes()]);
        start_date = new Date(start_date.getTime() + 30 * 60000);
    }

    return true;
}

这是我的代码流程,我在javascript中将所有任务添加到json数组中。每次添加新任务都会检查json数组对象上的现有任务(如果存在任务,则内部)时间是否重叠。

Here is a fiddle

3 个答案:

答案 0 :(得分:3)

我认为这是一个'重构,如果你想调试'案例 只需将问题分解为孤立的,小的,简单的问题,就可以比任何深度调试更快地找到解决方案 您应该通过使用对象来分解代码的复杂性, 所以你可以清楚地了解谁做了什么,你可以测试 很容易每个部分 我不确定下面的代码是否符合您的所有需求,但它确实如此 应该更容易使用:我定义了2个对象:一个任务, 和一套任务。
对于每个我定义的非常简单的方法,易于阅读和调试。

我没有测试结果,但你会明白如何做到这一点 你想从这里来。

http://jsfiddle.net/gamealchemist/b68Qa/2/

// ------------------------------  
// Task
function Task(startDate, endDate) {
    this.start = startDate;
    this.end = endDate;
}

// returns wether the time range overlaps with this task
Task.prototype.overlap = function (start, end) {
    return (this.start <= end && this.end >= start);
}

// returns a string describing why the task is wrong, or null if ok
function checkTask(start, end) {
    if (start > end) return "End time should exceed the start time";
    if (start == end) return "End time should not same as the start time";
    return null;
}

现在有一组任务:

// ------------------------------  
// Task Set
function TaskSet() {
    this.tasks = [];
    this.minDate = 0;
    this.maxDate = 0;
}

// returns a string describing why the task cannot be added, or null if ok
TaskSet.prototype.check = function (start, end) {
    var tasks = this.tasks;
    // 1. Check date is valid
    var dateCheck = checkTask(start, end);
    if (dateCheck) return dateCheck;
    // 2. overlap check
    for (var i = 0; i < tasks.length; i++) {
        var thisTask = tasks[i];
        if (thisTask.overlap(start, end)) {
            return 'time overlaps with another task';
        }
    }
    return null;
}

// add the task.
TaskSet.prototype.add = function (start, end) {
    var tasks = this.tasks;
    if (task.length) {
        this.minDate = start;
        this.maxDate = end;
    }
    if (start < minDate) minDate = start;
    if (end > maxDate) maxDate = end;
    // you might want to check before inserting.
    tasks.push(new Task(start, end));
}

// displays the current task inside the tasks div.
TaskSet.prototype.show = function () {
    var tasks_array = this.tasks;
    $("#tasks").html('');
    $.each(tasks_array, function (index, item) {
        var newRowContent = "<div>" + item.start_time + "-" + item.end_time + "</div>";
        $("#tasks").append(newRowContent);
    });
}

让我们使用这些对象:

// ---------------------------
var myTasks = new TaskSet();


$("#addtask").click(handle_AddTask_Clicked);

function handle_AddTask_Clicked(e) {
    e.preventDefault();

    var start = $("#task_stime").val();
    var end = $("#task_etime").val();

    var start_time = Date.parse("1-1-2000 " + start);
    var end_time = Date.parse("1-1-2000 " + end);

    var checkCanAdd = myTasks.check(start_time, end_time);
    if (!checkCanAdd) {
        myTasks.add(start_time, end_time);
        myTasks.show(); // notice you might auto-refresh withinin add
    } else {
        alert(checkCanAdd);
    }
}

答案 1 :(得分:0)

最后我从朋友那里得到了以下代码的解决方案:

function disabletime(start_time, end_time) {
    var start_date = start_time;
    var end_date = end_time;

    var disable_times = new Array();
    var max_date = 0;
    var min_date = 0;

    var startTimeOverlapIndex = -1;
    var endTimeOverlapIndex = -1;
    var sameDateIndex = -1;

    if (tasks_array.length > 0) {
        for (var i = 0; i < tasks_array.length; i++) {
            var prev_s_date = new Date("January 1, 1111 " + tasks_array[i].start_time);
            var prev_e_date = new Date("January 1, 1111 " + tasks_array[i].end_time);

            if(end_date<=prev_e_date) {
                if(end_date>prev_s_date) {
                    endTimeOverlapIndex = i+1;
                    break;
                }
            }

            if(start_date<prev_e_date) {
                if(start_date>=prev_s_date) {
                    startTimeOverlapIndex = i+1;
                    break;
                } else {
                    if(end_date>prev_s_date) {
                        endTimeOverlapIndex = i+1;
                        break;
                    }
                }
            }

            if(start_date.toString()===prev_s_date.toString() && end_date.toString()===prev_e_date.toString()) {
                sameDateIndex = i+1;
                break;
            }
        }

        if(sameDateIndex>0) {
            alert("Sorry! your time cannot be same as task ("+startTimeOverlapIndex+"), please check again!");
            return false;
        } else if(startTimeOverlapIndex>0) {
            alert("Sorry! your START time is overlaping with task ("+startTimeOverlapIndex+"), please check again!");
            return false;
        } else if(endTimeOverlapIndex>0) {
            alert("Sorry! your END time is overlaping with task ("+endTimeOverlapIndex+"), please check again!");
            return false;
        } else {
            //do whatever you do
            return true;
        }
    }
    return true;
}

小提琴的实时链接在这里找到

http://jsfiddle.net/mur7H/

答案 2 :(得分:0)

正在100%工作。请在下面找到日期和时间重叠的正确答案。

{{1}}