需要根据后台数据库所设置的工作时间(比如上午8:00-12:00,下午3:00-6:00),周工作日(比如周一到周五),节假日(10.1-10.7)等等,输入时间段,得到一个时间点,比如在9.30下午5:50输入两个小时,系统会自动把时间算到10.8上午9:50
在哪可以找到这样的算法?或是代码?
能提供一个有效连接就可以了,或是应该在google里输入什么单词才能找到相关信息?

解决方案 »

  1.   

    //算出一个月的每一周的周一和周日 private DataTable GetWeek(DateTime datetime)
    {
    int weekNum = 0;
    DataTable weekTable = new DataTable();
    weekTable.Columns.Add("week");
    weekTable.Columns.Add("firstday");
    weekTable.Columns.Add("lastday"); int d = Convert.ToInt32(DateTime.DaysInMonth(datetime.Year,datetime.Month));//某月的天数
    int lastday;

    if((datetime.Month-1)>0)
    {
    lastday = Convert.ToInt32(DateTime.DaysInMonth(datetime.Year,(datetime.Month-1)));//某月上个月的天数
    }
    else
    {
    lastday = Convert.ToInt32(DateTime.DaysInMonth((datetime.Year-1),12));//某月上个月的天数
    }
    int y = Convert.ToInt32(datetime.Year.ToString());
    int m = Convert.ToInt32(datetime.Month.ToString());
    DateTime firstWeekMonday =new DateTime() ;
    DateTime firstWeekSunday = new DateTime();
    string weekday = Convert.ToDateTime(y+"-"+m+"-"+"01").DayOfWeek.ToString();
    //判断某个月的第一周的周一和周五的具体时间
    switch(weekday)
    {
    case "Monday":
    firstWeekMonday = Convert.ToDateTime(y+"-"+m+"-"+"01");
    firstWeekSunday = Convert.ToDateTime(y+"-"+m+"-"+"07");
    break;
    case "Tuesday":
    firstWeekMonday = Convert.ToDateTime(y+"-"+(m-1)+"-"+lastday);
    firstWeekSunday = Convert.ToDateTime(y+"-"+m+"-"+"06");
    break;
    case "Wednesday":
    firstWeekMonday = Convert.ToDateTime(y+"-"+(m-1)+"-"+(lastday-1));
    firstWeekSunday = Convert.ToDateTime(y+"-"+m+"-"+"05");
    break;
    case "Thursday":
    firstWeekMonday = Convert.ToDateTime(y+"-"+m+"-"+"05");
    firstWeekSunday = Convert.ToDateTime(y+"-"+m+"-"+"11");
    break;
    case "Friday":
    firstWeekMonday = Convert.ToDateTime(y+"-"+m+"-"+"04");
    firstWeekSunday = Convert.ToDateTime(y+"-"+m+"-"+"10");
    break;
    case "Saturday":
    firstWeekMonday = Convert.ToDateTime(y+"-"+m+"-"+"03");
    firstWeekSunday = Convert.ToDateTime(y+"-"+m+"-"+"09");
    break;
    case "Sunday":
    firstWeekMonday = Convert.ToDateTime(y+"-"+m+"-"+"02");
    firstWeekSunday = Convert.ToDateTime(y+"-"+m+"-"+"08");
    break;
    default:
    break;
    }
    // 第一周的具体时间
    weekTable.Rows.Add(weekTable.NewRow());
    weekTable.Rows[weekNum]["week"] = 1;
    weekTable.Rows[weekNum]["firstday"] = firstWeekMonday.ToString("yyyy-MM-dd");
    weekTable.Rows[weekNum]["lastday"] = firstWeekSunday.ToString("yyyy-MM-dd");
    // 最后一周前的几周时间
    for(int i = Convert.ToInt32(firstWeekSunday.Day+7);i<d;i+=7)
    {
    weekNum = weekNum + 1;
    weekTable.Rows.Add(weekTable.NewRow());
    weekTable.Rows[weekNum]["week"] = weekNum+1;
    weekTable.Rows[weekNum]["firstday"] = Convert.ToDateTime(y+"-"+m+"-"+(i-6)).ToString("yyyy-MM-dd");
    weekTable.Rows[weekNum]["lastday"] = Convert.ToDateTime(y+"-"+m+"-"+i).ToString("yyyy-MM-dd");
    }
    int finalDay = Convert.ToInt32(Convert.ToDateTime(weekTable.Rows[weekNum]["lastday"]).Day);//某个月倒数第二周的上周日
    // 最后一周的具体时间
    //判断某个月的最后一周是在本月还是在下个月 if(d-finalDay>=3)
    {
    weekNum = weekNum + 1;
    weekTable.Rows.Add(weekTable.NewRow());
    weekTable.Rows[weekNum]["week"] = weekNum+1;
    weekTable.Rows[weekNum]["firstday"] = Convert.ToDateTime(y+"-"+m+"-"+(finalDay+1)).ToString("yyyy-MM-dd");
    if((7-(d-finalDay)) == 0)
    {
    weekTable.Rows[weekNum]["lastday"] = Convert.ToDateTime(y+"-"+m+"-"+d).ToString("yyyy-MM-dd");
    }
    else
    {
    if(m == 12)
    {
    weekTable.Rows[weekNum]["lastday"] = Convert.ToDateTime((y+1)+"-"+1+"-"+(7-(d-finalDay))).ToString("yyyy-MM-dd");
    }
    else
    {
    weekTable.Rows[weekNum]["lastday"] = Convert.ToDateTime(y+"-"+(m+1)+"-"+(7-(d-finalDay))).ToString("yyyy-MM-dd");
    }
    }
    }
    return weekTable;
    }
    这是我自己写的随便输入一个日期就能把这个月的所有周一和周日的日期都显示出来的
    可能效率不是很高。希望能有人指点一下
      

  2.   

    判断指定的时间是否是工作时间,寻找指定的时间以后的n个中断点,(n>=待计算增加时间/日工作时间*2)如果指定的时间是工作时间,n取偶数,否则取奇数,我觉得是关键。如楼主举的例子中指定的时间是工作时间,n=2 寻找,9月30日下午5点半之后的2个中断点(9月30日下午6点下班,10月8日上午上班)然后n为奇数的话把指定的时间也作为中断点,使n变成偶数,然后循环用第2i个中断点减2i-1个中断点的时间累加。如上例用 10月8日上午8点减9月30日下午6点,得到差。最后是加法,可以得到最后结果。
      

  3.   

    这个问题比较难,估计很难搜到想了半天,没什么太好的办法,随便说一下,抛砖引玉吧用一个专用的函数,建一个数据结构,该结构是永久性的,只要工作时间的设定不改变,该结构就不用改变。该结构是x的一个数组class x{ DateTime 截止时间; bool 是工作时间};每次工作时间和非工作时间交替,生成一个新的x实例。从以前到以后,生成一个x[]用的时候在x[]中搜索输入的时间,如果搜到的x[i]是工作时间,就从小时数中减去,当然,要做很多判断,比较麻烦,弄个图吧
    ---|---工作-----|--非工作--|------工作-------|---非工作---|
            x[i]       x[i+1]      x[i+2]           x[i+3]
       输入的时间|<-|~~~~~~~~~~|--->|
                   t1            t2
    t1+t2就是2小时,9月30日18:00减17:50=t1=10分钟,2小时减t2=1小时50分,x[i+1]的截止时间+1小时50分就是t2结束的时间。
    当然还要考虑t1、t2 跨越一个x的情况,终究比较麻烦