求助版主或高手:求一难度非常高的时间段判断函数

lawdoor 2008-06-26 02:49:07
<html>
<title>时间段判断问题</title>
<head>
<script language=javascript>
function check()
{

}
</head>
<form name=form1>
时间:<input name=txt_time><br>
<input type=button value=check onclick=check();>
</form>
</body>
</html>

时间格式为03:00-06:00 07:30-08:40 09:10-10:10......
不知道用户要输入多少个时间段,需要判断条件:
1.时间格式正确:小时如果在10以内补0,如:09不能是9
2.两个时间以"-"相隔,两个时间段以一个空格相隔。
3.时间段从00:00:00到23:59:59
4.最主要是时间段不能有交集。
哪位高手帮帮忙哦
...全文
237 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenlz123 2008-06-26
  • 打赏
  • 举报
回复
<!--我不懂regexp,写不出楼上这么难的算法 并且为了简单,只实现了楼主所说的部分功能-->
<head>
<script type="text/javascript">
function check()
{
//finalcolapse为判断最终整体所有时间是否冲突
var finalcolapse=false;
var timeInput=document.getElementById("txt_time").value;
var stringArray=timeInput.split(" ");
//判断每个时间段中是否有"-"
for(var i=0;i<stringArray.length;i++)
{
if(stringArray[i].indexOf("-")==-1)
{
alert("时间段中应包含'-'");
return;
}
}
//比较每一个时间段是否有冲突
for(var i=0;i<stringArray.length-1;i++)
{
var cell=stringArray[i];
for(var j=i+1;j<stringArray.length;j++)
{
if(timespacecolapse(cell,stringArray[j])==true)
{finalcolapse=true;break;}
}
if(finalcolapse==true){alert("时间冲突");break;}
}
if(finalcolapse==false)
{alert("所有时间均未冲突");}
}
//判断两个时间区间是否重叠,true表示冲突,false表示未冲突
function timespacecolapse(timespace1,timespace2)
{
if(cmptime(getStartTime(timespace1),getStartTime(timespace2))>=0
&& cmptime(getStartTime(timespace1),getEndTime(timespace2))==-1)
{return true;}
else if(cmptime(getEndTime(timespace1),getStartTime(timespace2))==1
&& cmptime(getEndTime(timespace1),getEndTime(timespace2))<=0)
{return true;}
else
{return false;}
}
//获取起始时间
function getStartTime(t)
{
return t.slice(0,t.indexOf('-'));
}
//获取结束时间
function getEndTime(t)
{
return t.slice(t.indexOf('-')+1,t.length);
}
//具体比较两个时间的大小
function cmptime(t1,t2)
{
//hour_t1为t1的小时部分
var hour_t1=parseInt(t1.slice(0,t1.indexOf(':')));
//minute_t1为t1的分钟部分
var minute_t1=parseInt(t1.slice(t1.indexOf(':')+1,t1.length));
var hour_t2=parseInt(t2.slice(0,t2.indexOf(':')));
var minute_t2=parseInt(t2.slice(t2.indexOf(':')+1,t1.length));
if(hour_t1>hour_t2){return 1;}
else if(hour_t1<hour_t2){return -1;}
else{
if(minute_t1>minute_t2){return 1;}
else if(minute_t1<minute_t2){return -1;}
else{/*他们相等*/return 0;}
}

}
</script>
</head>
<body>
<form id=form1 action="">
时间: <input id=txt_time value="8:00-9:00 7:50-8:50"><br>
<input type=button value=check onclick="check();">
</form>
</body>
muxrwc 2008-06-26
  • 打赏
  • 举报
回复
写了一个.如果只补0的话那很简单...
<input id="time" value="03:00-06:00 07:30-08:40 09:10-10:10 6:0-06:50" style="width:500px;" />
<input type="button" id="click" value="测试" />
<script type="text/javascript">
document.getElementById('click').onclick = function () {
var ps = '(?:2[0-3]|[01]?[0-9]):[0-5]?[0-9]-(?:2[0-3]|[01]?[0-9]):[0-5]?[0-9]';
var pattern = new RegExp('^[\\s\\u3000\\xA0]*' + ps + '(?:[\\s\\u3000\\xA0]+' + ps + ')*[\\s\\u3000\\xA0]*$');
var spattern = /\b(2[0-3]|[01]?[0-9]):([0-5]?[0-9])-(2[0-3]|[01]?[0-9]):([0-5]?[0-9])\b/g;
var time = document.getElementById('time');
var ary = [], a, b;

if (pattern.test(time.value)) {
while (spattern.test(time.value)) {
//稍微排序下
a = 1 * ((RegExp.$1 * 100).toString().slice(0, 4) * 1 + RegExp.$2 * 1), b = 1 * ((RegExp.$3 * 100).toString().slice(0, 4) * 1 + RegExp.$4 * 1);
ary.push(a <= b ? [a, b] : [b, a]);
}
ary.sort(function (a, b) { return a[0] - b[0]; }); //排序
for (var i = 1, l = ary.length ; i < l ; i ++) { //判断交
if (ary[i - 1][1] > ary[i][0]) {
alert('不允许交集');
}
}

ary = ary.toString().split(',');

for (var i = 0, l = l * 2, s = [] ; i < l ; i ++) {
//补0并还原数据
if (ary[i] * 1 < 1000) ary[i] = '0' + ary[i];
ary[i] = ary[i].split(/(?=.{2}$)/).join(':');
if (i % 2 > 0) s.push(ary[i - 1] + '-' + ary[i]);
}

time.value = s.join('\xA0');
//返回排序后的并且补0的结果
} else {
alert('数据不合法');
time.focus();
time.select();
}
}
</script>
lawdoor 2008-06-26
  • 打赏
  • 举报
回复
描述很清楚:
是无限时间段并且每一个时间段以空格区分。
muxrwc 2008-06-26
  • 打赏
  • 举报
回复
交集问题用Date对象就可以很简单的解决吧.
不过,你的时间格式描述的不清楚呢...

用户可以输入无限时间段?以空格区分?

87,922

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧