现在有4个时间段,分别有起始时间和结束时间,一共8个时间点.大致如下:时间段  开始时间   结束时间
T1        S1       E1
T2        S2       E2
T3        S3       E3
T4        S4       E4现在要保证T1~T4,4个时间段不重叠(也就是类似E1>S2),而且开始时间和结束时间都为00:00的时候则不去判断该时间段.比如:
T1     01:00    02:00
T2     00:00    00:00
T3     01:00    03:00
T4     04:00    05:00
虽然E1>S2,但是 S2和E2都为00:00,所以忽略.但此时E1>S3,所以还是应该弹出提示.
怎么样做一个完整的验证?大家帮帮忙哈,谢谢了

解决方案 »

  1.   

    建了 Time 和 Period 两个对象,代码比较多,但很容易扩展,
    不明白的话就查查手册L@_@K
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>javascriptExtension.TimePeriodCompare.html</title>
        <meta name="generator" content="editplus" />
        <meta name="author" content="[email protected]" />
        <meta name="keywords" content="" />
        <meta name="description" content="" />
    </head>
    <body>
    <script type="text/javascript">
    <!--function Time(hourNumber, minuteNumber) {
        if (isNaN(hourNumber) || hourNumber < 0 || hourNumber > 23)
            throw new Error("Time 实例化失败:无效的小时数,合理取值范围是 0 至 23。无效值为 " + hourNumber);
        if (isNaN(minuteNumber) || minuteNumber < 0 || minuteNumber > 59)
            throw new Error("Time 实例化失败:无效的分钟数,合理取值范围是 0 至 59。无效值为 " + minuteNumber);    this.Hour = hourNumber;
        this.Minute = minuteNumber;
    }
    Time.prototype.toString = function() {
        var h = (this.Hour < 10) ? ("0"+this.Hour) : this.Hour;
        var m = (this.Minute < 10) ? ("0"+this.Minute) : this.Minute;
        return h + ":" + m;
    };
    /*
    负值,如果所传递的第一个参数比第二个参数小。
    零,如果两个参数相等。
    正值,如果第一个参数比第二个参数大。
    */
    Time.Compare = function(firstTime, secondTime) {
        var returnValue = 0;
        if (firstTime.Hour > secondTime.Hour)
            returnValue++;
        else if (firstTime.Hour < secondTime.Hour)
            returnValue--;
        else {
            if (firstTime.Minute > secondTime.Minute)
                returnValue++;
            else if (firstTime.Minute < secondTime.Minute)
                returnValue--;
        }
        return returnValue;
    };
    Time.Parse = function(timeString) {
        var hm = timeString.split(":");
        return new Time(parseInt(hm[0],10), parseInt(hm[1],10));
    };function Period(startTimeString, endTimeSting) {
        var start = Time.Parse(startTimeString);
        var end = Time.Parse(endTimeSting);    if (Time.Compare(start, end) == 1)
            throw new Error("Period 实例化失败:非法的起止时间,起始时间应小于或等于终止时间。起始时间为 " + startTimeString + ",终止时间为 " + endTimeSting);    this.StartTime = start;
        this.EndTime = end;
    }
    Period.prototype.toString = function() {
        return this.StartTime + " - " + this.EndTime;
    };
    Period.prototype.IsZero = function() {
        var zero = "00:00";
        if (this.StartTime == zero && this.EndTime == zero)
            return true;
        else
            return false;
    };
    Period.Compare = function(firstPeriod, secondPeriod) {
        var returnValue = 0;
        if (Time.Compare(firstPeriod.StartTime, secondPeriod.StartTime) == 1)
            returnValue++;
        else if (Time.Compare(firstPeriod.StartTime, secondPeriod.StartTime) == -1)
            returnValue--;
        else {
            if (Time.Compare(firstPeriod.EndTime, secondPeriod.EndTime) == 1)
                returnValue++;
            else if (Time.Compare(firstPeriod.EndTime, secondPeriod.EndTime) == -1)
                returnValue--;
        }
        return returnValue;
    };
    // 判断给定的时段数组中是否存在时段重叠。
    Period.HasOverlap = function(periodArray) {
        if (periodArray instanceof Array)
        {
            var copyPeriodList = periodList.slice(0);
            // 排序后,所有的 Zero 都排列到数组前端。
            copyPeriodList.sort(Period.Compare);        var first, second;
            var len = copyPeriodList.length - 1;
            for (var i=0; i<len; i++)
            {
                if (copyPeriodList[i].IsZero())
                    continue;            first = copyPeriodList[i];
                second = copyPeriodList[i+1];            if (Time.Compare(first.EndTime, second.StartTime) == 1)
                {
                    // [DEBUG]
                    //alert(first + "\r\n" + second);
                    return true;
                }
            }        return false;
        }
        else
            throw new Error("periodArray 为非法类型参数,须传入 Array 实例。");
    };/*
    T1 01:00 02:00
    T2 00:00 00:00
    T3 01:00 03:00
    T4 04:00 05:00
    */
    var periodList = new Array();
    periodList.push(new Period("01:00", "02:00"));
    periodList.push(new Period("00:00", "00:00"));
    periodList.push(new Period("01:00", "03:00"));
    periodList.push(new Period("04:00", "05:00"));alert(Period.HasOverlap(periodList));
    //-->
    </script>
    </body>
    </html>
    Web 开发常用手册DHTML 参考手册
    http://download.csdn.net/source/308913JScript 语言参考
    http://download.csdn.net/source/308916CCS 样式表中文手册
    http://download.csdn.net/source/304124
      

  2.   

    汗,比我想的长多了.
    弹出true就不对啊,T1和T3重叠了,我再研究下你写的
      

  3.   

    呵呵,不用研究了,Period.HasOverlap 返回 true 表示有重叠,没重叠时才返回 false!俺贴的都是经过测试的代码,两颗星可不是混的,嘿嘿
      

  4.   

    对了,你把 debug 下面那句打开就明白了
                    // [DEBUG]
                    //alert(first + "\r\n" + second);