87,922
社区成员
发帖
与我相关
我的任务
分享
// [DEBUG]
//alert(first + "\r\n" + second);
<!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="yixianggao@126.com" />
<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>