有5个时间段(将一天分为5段),
1. 00:00-8:00
2. 08:00-12:00
3. 12:00-13:00
4. 13:00-17:00
5. 17:00-23:59
现在我要传入两个参数,一个开始时间,一个结束时间(两个时间不确定分别在哪个时间段,但结束时间大于开始时间)
2,4时间段为有效时间段(上班时间)1,3,5为休息时间,传入的开始结束时间为请假的开始时间和结束时间
现要判断一天请了多少时间的假
想来想去想不到好方法,总不能写15个if else吧,那以后维护太麻烦了,谁有好办法,帮帮忙,谢谢

解决方案 »

  1.   

    假设,精确到分钟。若需要精确到妙,则相应作改动即可思路:将各个时间节点转换为距离00:00的分钟数,将传入的开始、结束时间相应也转换为距离00:00的分钟数,然后分别计算落入两个工作时间段内的分钟数,累加后即可得到结果具体实现://将分钟数转换为“00:00”的字符串形式
    private  string MinsToTime(int mins)
    {
    int hh = mins/60;
    int mm = mins - hh * 60;
    string ss = hh.ToString("D2") + ":" + mm.ToString("D2");
    return ss;
    }//将“00:00”形式的字符串转换为分钟数
    private  int TimeToMins(string str)
    {
    int iRet = 0;
    try
    {
    string delimStr = ":";
    char [] delimiter = delimStr.ToCharArray();
    string[] ss = str.Split(delimiter);
    int hh = Convert.ToInt32(ss[0]);
    int mm = Convert.ToInt32(ss[1]);
    iRet = hh * 60 + mm;
    }
    catch{}
    return iRet;
    }//计算结果,返回“00:00”形式的字符串
    private string Calc(string str_start,string str_end)
    {
    int t_wk1_s = TimeToMins("08:00");
    int t_wk1_e = TimeToMins("12:00");
    int t_wk2_s = TimeToMins("13:00");
    int t_wk2_e = TimeToMins("17:00"); int t_st = TimeToMins(str_start);
    int t_ed = TimeToMins(str_end); int mins1 = Math.Min(t_ed,t_wk1_e) - Math.Max(t_st,t_wk1_s);
    mins1 = (mins1<0) ? 0 : mins1;
    int mins2 = Math.Min(t_ed,t_wk2_e) - Math.Max(t_st,t_wk2_s);
    mins2 = (mins2<0) ? 0 : mins2; return MinsToTime(mins1+mins2);
    }
      

  2.   


    你说的这些情况都包括在代码里面了!起始你只要关心工作时间段,第一个工作时间段08:00-12:00和第二个工作时间段13:00-17:00就行了呀!你可以把这段代码copy到你的程序里面,盐酸以下就知道了,肯定都包括了!
      

  3.   

    感谢syl2000,问题解决了,非常感谢,逻辑还要好好想下
      

  4.   

    嗯!把Calc里面的逻辑理清就可以了!
      

  5.   

    public int TimeToMin(string str)
            {
                str = str.Replace(":","*60+");
                return (int)new DataTable().Compute(str, "");
            }