关于时间问题;

时间:2022-10-19 16:32:19
需求是;通过js实现。
做一个会议室预定,

周一预定周一到周五,
周二预定周二到周五,
周三预定周三到周五,
周四预定周四到周五,
周五预定周五,并且周五下午13;30开始预定下周一到周五。
请教这个js判断怎么完成,还有服务端怎么完成;给点思路,大概的代码解释?
分数给足……请大家帮忙解决!

26 个解决方案

#2


楼主这个问题可以用客户端时间控件即可解决,先去下载一个My97DatePicker日期控件,通过下面的例子进行扩充,无非就是设置一下选择的时间段范围

<html>   
  <head>   
      
    <title>test</title>     
    <script language="javascript" type="text/javascript" src="Ext/My97DatePicker/WdatePicker.js"></script>  
  </head>   
     
  <body>   
    <input type="text" class="Wdate" onFocus="WdatePicker({minDate:'%y-%M-01',maxDate:'%y-%M-%ld',disabledDays:[1,3,6]})"/>
  </body>   
</html>

#3


获取当前时间,得到星期几,
1、只要不是星期五,日期控件设置mindate:当前时间,maxdate:本周周五(如果还有小时、分、秒,也要一起加上)
2、如果是星期五,
21、当前时间没有大于13;30,日期控件设置mindate:当前时间,maxdate:本周周五(如果还有小时、分、秒,也要一起加上)
22、当前时间大于13;30,日期控件设置mindate:下周周一,maxdate:下周周五(如果还有小时、分、秒,也要一起加上)

#4


My97Date 我也用过,功能确实很强大,楼主可以看看

#5


我用的就是My97Date ,但是就是判断预定时间的限制!关键是判断上面我说的需求,其他的添加会议室重复已经解决。
周一预定周一到周五,
周二预定周二到周五,
周三预定周三到周五,
周四预定周四到周五,
周五预定周五,并且周五下午13;30开始预定下周一到周五。这个My97Date 可以做到吗?

#6


这个控件怎么判断
是自己在WdatePicker()里另外写个方法吗?

获取当前时间,得到星期几,
1、只要不是星期五,日期控件设置mindate:当前时间,maxdate:本周周五(如果还有小时、分、秒,也要一起加上)
2、如果是星期五,
21、当前时间没有大于13;30,日期控件设置mindate:当前时间,maxdate:本周周五(如果还有小时、分、秒,也要一起加上)
22、当前时间大于13;30,日期控件设置mindate:下周周一,maxdate:下周周五(如果还有小时、分、秒,也要一起加上)

#7


My97DatePicker 演示和文档

二. 功能及示例
4. 日期范围限制

示例4-1-1 限制日期的范围是 2006-09-10到2008-12-20

<input id="d411" class="Wdate" type="text" onfocus="WdatePicker({skin:'whyGreen',minDate:'2006-09-10',maxDate:'2008-12-20'})"/>

示例4-1-2 限制日期的范围是 2008-3-8 11:30:00 到 2008-3-10 20:59:30

<input type="text" class="Wdate" id="d412" onfocus="WdatePicker({skin:'whyGreen',dateFmt:'yyyy-MM-dd HH:mm:ss',minDate:'2008-03-08 11:30:00',maxDate:'2008-03-10 20:59:30'})" value="2008-03-09 11:00:00"/>

#8


代码实现其实不难,只要有思路,给你个提示,楼主得自己去完善,有问题再问

<html>   
  <head>   
      
    <title>test</title>     
    <script language="javascript" type="text/javascript" src="Ext/My97DatePicker/WdatePicker.js"></script>  
  </head>
  <body>
<script language="javascript">
function datepick()
{
    var weekday="星期"+"日一二三四五六".substr(new Date().getDay(),1);
    var dtbegin,dtend;
    switch(weekday)
    {
        case "星期一":
            break;
        case "星期二":
            break;
        case "星期三":
            dtbegin="2011-08-24";
            dtend="2011-08-26";
            break;
        case "星期四":
            break;
        case "星期五":
            break;
    }
    return WdatePicker({minDate:dtbegin,maxDate:dtend});
}
</script>
 
    <input type="text" class="Wdate" onFocus="datepick()"/>
  </body>   
</html>

#9


function datepick()
{
    var weekday="星期"+"日一二三四五六".substr(new Date().getDay(),1);
    var dtbegin,dtend;
    switch(weekday)
    {
        case "星期一":
    dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+5} 23:59:59";
            break;
        case "星期二":
    dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+4} 23:59:59";
            break;
        case "星期三":
            dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+3} 23:59:59";
            break;
        case "星期四":
    dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+2} 23:59:59";
            break;
        case "星期五":
    dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+1} 23:59:59";
            break;
//minDate:'%y-%M-%d 00:00:00',maxDate:'%y-%M-#{%d+4} 23:59:59'
    }
    return WdatePicker({minDate:dtbegin,maxDate:dtend,disabledDays:[6,0],specialDays:[1,2,3,4,5]});
}

我的修改是这样的,不知道是否有问题!呵呵

#10


但是还有个问题就是关于周五13:30这个判断该如何做?

#11


那就在case "星期五":里面再判断当前时间是否已经超过13:30

#12


自己不断的调试,不断的完善,相信离成功不远了

#13


case "星期五":
            break;

case里面还可以加判断吗?

#14




加if啊。~

#15


这样的吗?
case "星期三":
if(ordertime>=atorder){
 dtbegin="%y-%M-%d 00:00:00";
         dtend="%y-%M-#{%d+9} 23:59:59";
}else{
            dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+3} 23:59:59";
}
            break;

#16


有这样的写法吗?case "星期三":
if(ordertime>=atorder){
 dtbegin="%y-%M-%d 00:00:00";
         dtend="%y-%M-#{%d+9} 23:59:59";
}else{
            dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+3} 23:59:59";
}
            break;

#17


引用 16 楼 zy205817 的回复:
有这样的写法吗?case "星期三":
if(ordertime>=atorder){
dtbegin="%y-%M-%d 00:00:00";
         dtend="%y-%M-#{%d+9} 23:59:59";
}else{
            dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+3……


当然可以

#18


谢谢大家的热心帮忙啊!非常感谢啊!还有一个问题的就是客户端已经验证完成,但是服务端怎么解决预定会议室重复的问题?

#19


顶上去,关于在服务端该如何判断呢?

#20


用会议室有主键,加2个时间段是否有交集

这边你要写一个循环,获取会议室下数据库已有的预定所有记录,分别取出开始时间S21和结束时间S22,通过客户端获取的开始时间S11和结束时间S12

四个变量的单位你可以以一个固定时间(1900-01-01 00:00:00)作为参考值,分别得到秒数
private bool HasJoin(int s11,int s12,int s21,int s22)
{
   if((s12<s21) || (s12>s22))
   {
      //无交集,即不冲突
      return false;
    }
    else
   {
      //有交集,即冲突
       return true;
    }
}

#21


如果通过sql语句完成,怎么样?

#22


这个前台设计好了,只需要后台判断了。哪用得着前后两重关。后台如何判断,楼主应该没问题吧。

前台部分,你在后台里根据时间,只输出他可以选择的范围。至于他是不是手工修改了不可选的范围也没关系,反正到了后台,无论是输入有效性还是预定的有效性都统统验证一下。

#23


比如,既然对周三来说,周一和周二已经不可选了,那你输出出来干嘛?用户看着碍眼不说,你再用JS判断然后提示用户这两天不能选,不纯粹画蛇添足吗?直接在后台里根据时间,作废的选项就不输出,只输出可选的选项就行了。

#24


引用 22 楼 theforever 的回复:
这个前台设计好了,只需要后台判断了。哪用得着前后两重关。后台如何判断,楼主应该没问题吧。

前台部分,你在后台里根据时间,只输出他可以选择的范围。至于他是不是手工修改了不可选的范围也没关系,反正到了后台,无论是输入有效性还是预定的有效性都统统验证一下。

后台还是需要再次验证的,前台可能同时有多人申请,那么到后台必须得验证申请会议室的时间段是否已经有人申请

#25


引用 24 楼 jsnt_rd 的回复:
后台还是需要再次验证的,前台可能同时有多人申请,那么到后台必须得验证申请会议室的时间段……

如果用户在前台操作界面停留时间过长之后才提交申请,即使先前在前台用AJAX取到了会议室状态是可以预订的,也可能由于提交之前的这段时间有人申请成功,而AJAX只在选择日期时验证过一次,而出现被别人先预订的返回消息。事实上,从返回预订页面,到用户选择预订时间的间隔不会太久(对于那些真想预订的人来说,在打开网站之前就已经有明确目标,上来就是操作),用AJAX即时验证都显得没什么必要。

我上面说的不全,应该是周三返回时不必包括周一和周二这样之前的日程,同时也排除被订下的日程,只返回空置可选择的日程。

#26


如果仅仅在客户端验证,假如有的人将客户端的时间调整,你服务端不去做验证,这样就出乱的。

#1


#2


楼主这个问题可以用客户端时间控件即可解决,先去下载一个My97DatePicker日期控件,通过下面的例子进行扩充,无非就是设置一下选择的时间段范围

<html>   
  <head>   
      
    <title>test</title>     
    <script language="javascript" type="text/javascript" src="Ext/My97DatePicker/WdatePicker.js"></script>  
  </head>   
     
  <body>   
    <input type="text" class="Wdate" onFocus="WdatePicker({minDate:'%y-%M-01',maxDate:'%y-%M-%ld',disabledDays:[1,3,6]})"/>
  </body>   
</html>

#3


获取当前时间,得到星期几,
1、只要不是星期五,日期控件设置mindate:当前时间,maxdate:本周周五(如果还有小时、分、秒,也要一起加上)
2、如果是星期五,
21、当前时间没有大于13;30,日期控件设置mindate:当前时间,maxdate:本周周五(如果还有小时、分、秒,也要一起加上)
22、当前时间大于13;30,日期控件设置mindate:下周周一,maxdate:下周周五(如果还有小时、分、秒,也要一起加上)

#4


My97Date 我也用过,功能确实很强大,楼主可以看看

#5


我用的就是My97Date ,但是就是判断预定时间的限制!关键是判断上面我说的需求,其他的添加会议室重复已经解决。
周一预定周一到周五,
周二预定周二到周五,
周三预定周三到周五,
周四预定周四到周五,
周五预定周五,并且周五下午13;30开始预定下周一到周五。这个My97Date 可以做到吗?

#6


这个控件怎么判断
是自己在WdatePicker()里另外写个方法吗?

获取当前时间,得到星期几,
1、只要不是星期五,日期控件设置mindate:当前时间,maxdate:本周周五(如果还有小时、分、秒,也要一起加上)
2、如果是星期五,
21、当前时间没有大于13;30,日期控件设置mindate:当前时间,maxdate:本周周五(如果还有小时、分、秒,也要一起加上)
22、当前时间大于13;30,日期控件设置mindate:下周周一,maxdate:下周周五(如果还有小时、分、秒,也要一起加上)

#7


My97DatePicker 演示和文档

二. 功能及示例
4. 日期范围限制

示例4-1-1 限制日期的范围是 2006-09-10到2008-12-20

<input id="d411" class="Wdate" type="text" onfocus="WdatePicker({skin:'whyGreen',minDate:'2006-09-10',maxDate:'2008-12-20'})"/>

示例4-1-2 限制日期的范围是 2008-3-8 11:30:00 到 2008-3-10 20:59:30

<input type="text" class="Wdate" id="d412" onfocus="WdatePicker({skin:'whyGreen',dateFmt:'yyyy-MM-dd HH:mm:ss',minDate:'2008-03-08 11:30:00',maxDate:'2008-03-10 20:59:30'})" value="2008-03-09 11:00:00"/>

#8


代码实现其实不难,只要有思路,给你个提示,楼主得自己去完善,有问题再问

<html>   
  <head>   
      
    <title>test</title>     
    <script language="javascript" type="text/javascript" src="Ext/My97DatePicker/WdatePicker.js"></script>  
  </head>
  <body>
<script language="javascript">
function datepick()
{
    var weekday="星期"+"日一二三四五六".substr(new Date().getDay(),1);
    var dtbegin,dtend;
    switch(weekday)
    {
        case "星期一":
            break;
        case "星期二":
            break;
        case "星期三":
            dtbegin="2011-08-24";
            dtend="2011-08-26";
            break;
        case "星期四":
            break;
        case "星期五":
            break;
    }
    return WdatePicker({minDate:dtbegin,maxDate:dtend});
}
</script>
 
    <input type="text" class="Wdate" onFocus="datepick()"/>
  </body>   
</html>

#9


function datepick()
{
    var weekday="星期"+"日一二三四五六".substr(new Date().getDay(),1);
    var dtbegin,dtend;
    switch(weekday)
    {
        case "星期一":
    dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+5} 23:59:59";
            break;
        case "星期二":
    dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+4} 23:59:59";
            break;
        case "星期三":
            dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+3} 23:59:59";
            break;
        case "星期四":
    dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+2} 23:59:59";
            break;
        case "星期五":
    dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+1} 23:59:59";
            break;
//minDate:'%y-%M-%d 00:00:00',maxDate:'%y-%M-#{%d+4} 23:59:59'
    }
    return WdatePicker({minDate:dtbegin,maxDate:dtend,disabledDays:[6,0],specialDays:[1,2,3,4,5]});
}

我的修改是这样的,不知道是否有问题!呵呵

#10


但是还有个问题就是关于周五13:30这个判断该如何做?

#11


那就在case "星期五":里面再判断当前时间是否已经超过13:30

#12


自己不断的调试,不断的完善,相信离成功不远了

#13


case "星期五":
            break;

case里面还可以加判断吗?

#14




加if啊。~

#15


这样的吗?
case "星期三":
if(ordertime>=atorder){
 dtbegin="%y-%M-%d 00:00:00";
         dtend="%y-%M-#{%d+9} 23:59:59";
}else{
            dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+3} 23:59:59";
}
            break;

#16


有这样的写法吗?case "星期三":
if(ordertime>=atorder){
 dtbegin="%y-%M-%d 00:00:00";
         dtend="%y-%M-#{%d+9} 23:59:59";
}else{
            dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+3} 23:59:59";
}
            break;

#17


引用 16 楼 zy205817 的回复:
有这样的写法吗?case "星期三":
if(ordertime>=atorder){
dtbegin="%y-%M-%d 00:00:00";
         dtend="%y-%M-#{%d+9} 23:59:59";
}else{
            dtbegin="%y-%M-%d 00:00:00";
            dtend="%y-%M-#{%d+3……


当然可以

#18


谢谢大家的热心帮忙啊!非常感谢啊!还有一个问题的就是客户端已经验证完成,但是服务端怎么解决预定会议室重复的问题?

#19


顶上去,关于在服务端该如何判断呢?

#20


用会议室有主键,加2个时间段是否有交集

这边你要写一个循环,获取会议室下数据库已有的预定所有记录,分别取出开始时间S21和结束时间S22,通过客户端获取的开始时间S11和结束时间S12

四个变量的单位你可以以一个固定时间(1900-01-01 00:00:00)作为参考值,分别得到秒数
private bool HasJoin(int s11,int s12,int s21,int s22)
{
   if((s12<s21) || (s12>s22))
   {
      //无交集,即不冲突
      return false;
    }
    else
   {
      //有交集,即冲突
       return true;
    }
}

#21


如果通过sql语句完成,怎么样?

#22


这个前台设计好了,只需要后台判断了。哪用得着前后两重关。后台如何判断,楼主应该没问题吧。

前台部分,你在后台里根据时间,只输出他可以选择的范围。至于他是不是手工修改了不可选的范围也没关系,反正到了后台,无论是输入有效性还是预定的有效性都统统验证一下。

#23


比如,既然对周三来说,周一和周二已经不可选了,那你输出出来干嘛?用户看着碍眼不说,你再用JS判断然后提示用户这两天不能选,不纯粹画蛇添足吗?直接在后台里根据时间,作废的选项就不输出,只输出可选的选项就行了。

#24


引用 22 楼 theforever 的回复:
这个前台设计好了,只需要后台判断了。哪用得着前后两重关。后台如何判断,楼主应该没问题吧。

前台部分,你在后台里根据时间,只输出他可以选择的范围。至于他是不是手工修改了不可选的范围也没关系,反正到了后台,无论是输入有效性还是预定的有效性都统统验证一下。

后台还是需要再次验证的,前台可能同时有多人申请,那么到后台必须得验证申请会议室的时间段是否已经有人申请

#25


引用 24 楼 jsnt_rd 的回复:
后台还是需要再次验证的,前台可能同时有多人申请,那么到后台必须得验证申请会议室的时间段……

如果用户在前台操作界面停留时间过长之后才提交申请,即使先前在前台用AJAX取到了会议室状态是可以预订的,也可能由于提交之前的这段时间有人申请成功,而AJAX只在选择日期时验证过一次,而出现被别人先预订的返回消息。事实上,从返回预订页面,到用户选择预订时间的间隔不会太久(对于那些真想预订的人来说,在打开网站之前就已经有明确目标,上来就是操作),用AJAX即时验证都显得没什么必要。

我上面说的不全,应该是周三返回时不必包括周一和周二这样之前的日程,同时也排除被订下的日程,只返回空置可选择的日程。

#26


如果仅仅在客户端验证,假如有的人将客户端的时间调整,你服务端不去做验证,这样就出乱的。