首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

获取startdate到enddate其间的时长,剔除8-12 14-18这2个时间段。返回总秒

2013-08-11 
获取startdate到enddate之间的时长,剔除8-12 14-18这2个时间段。返回总秒/// summary/// 获取startdate到

获取startdate到enddate之间的时长,剔除8-12 14-18这2个时间段。返回总秒


        /// <summary>
        /// 获取startdate到enddate之间的时长,剔除8-12 14-18这2个时间段。返回总秒
        /// </summary>
        /// <param name="startdate"></param>
        /// <param name="enddate"></param>
        /// <returns></returns>
        public static string getShiChang(string startdate, string enddate)
        {

            DateTime startTime = Convert.ToDateTime(startdate);
            DateTime endTime = Convert.ToDateTime(enddate);
            TimeSpan ts = new TimeSpan();
            double shichang = 0;
            double shichang1 = 0;
            double shichang2 = 0;
            double shichang3 = 0;
            //如果是周六周天,则所有时间都是有效时间
            if (startTime.DayOfWeek.ToString("d") == "0" || startTime.DayOfWeek.ToString("d") == "6")
            {
                ts = endTime - startTime;
                shichang1 = ts.TotalSeconds;
            }
            else
            {
                DateTime sys_startdate = Convert.ToDateTime(startTime.ToString("yyyy-MM-dd") + " " + "8:0:0");

                DateTime sys_enddate = Convert.ToDateTime(endTime.ToString("yyyy-MM-dd") + " " + "12:0:0");



                DateTime sys_startdate2 = Convert.ToDateTime(startTime.ToString("yyyy-MM-dd") + " " + "14:0:0");

                DateTime sys_enddate2 = Convert.ToDateTime(endTime.ToString("yyyy-MM-dd") + " " + "18:0:0");

                if (sys_startdate.CompareTo(startTime) == 1) //开始时间早于8点 7:00
                {
                    if (sys_startdate.CompareTo(endTime) == 1)//结束时间早于8点
                    {
                        ts = endTime - startTime;
                        shichang1 = ts.TotalSeconds;

                    }
                    else if (sys_enddate.CompareTo(endTime) == 1) //结束时间早于12点
                    {
                        ts = sys_startdate - startTime;
                        shichang1 = ts.TotalSeconds;
                    }
                    else if (sys_startdate2.CompareTo(endTime) == 1)//结束时间早于14点
                    {
                        ts = endTime - sys_enddate;
                        shichang1 = ts.TotalSeconds;


                        ts = sys_startdate - startTime;
                        shichang2 = ts.TotalSeconds;

                    }
                    else if (sys_enddate2.CompareTo(endTime) == 1)//结束时间早于18点
                    {
                        ts = sys_startdate2 - sys_enddate;
                        shichang1 = ts.TotalSeconds;
                        ts = sys_startdate - startTime;
                        shichang2 = ts.TotalSeconds;
                    }
                    else
                    {
                        ts = endTime - sys_enddate2;
                        shichang1 = ts.TotalSeconds;
                        ts = sys_startdate2 - sys_enddate;
                        shichang2 = ts.TotalSeconds;
                        ts = sys_startdate - startTime;
                        shichang3 = ts.TotalSeconds;


                    }

                }
                else if (sys_enddate.CompareTo(startTime) == 1) //开始时间处于8:00-12点
                {
                    if (sys_enddate.CompareTo(endTime) == 1)//结束时间处于8-12点,不计时
                    {
                        shichang1 = 0;
                    }

                    else if (sys_startdate2.CompareTo(endTime) == 1)//结束时间早于14点 则时长
                    {
                        ts = endTime - sys_enddate;
                        shichang1 = ts.TotalSeconds;

                    }
                    else if (sys_enddate2.CompareTo(endTime) == 1)//结束时间早于18点
                    {
                        ts = sys_startdate2 - sys_enddate;
                        shichang1 = ts.TotalSeconds;

                    }
                    else
                    {


                        ts = endTime - sys_enddate2;
                        shichang1 = ts.TotalSeconds;
                        ts = sys_startdate2 - sys_enddate;
                        shichang2 = ts.TotalSeconds;
                    }
                }
                else if (sys_startdate2.CompareTo(startTime) == 1)//开始时间处于12:00-14:00
                {
                    if (sys_startdate2.CompareTo(endTime) == 1)//结束时间处于12-14点
                    {
                        ts = endTime - startTime;
                        shichang1 = ts.TotalSeconds;
                    }

                    else if (sys_enddate2.CompareTo(endTime) == 1)//结束时间早于14-18点 则时长
                    {
                        ts = sys_startdate2 - startTime;
                        shichang1 = ts.TotalSeconds;
                    }

                    else


                    {
                        ts = endTime - sys_enddate2;
                        shichang1 = ts.TotalSeconds;
                        ts = sys_startdate2 - startTime;
                        shichang2 = ts.TotalSeconds;

                    }



                }
                else if (sys_enddate2.CompareTo(startTime) == 1)//开始时间处于14:00-18:00
                {
                    if (sys_enddate2.CompareTo(endTime) == 1)//结束时间处于14-18点
                    {
                        shichang1 = 0;
                    }
                    else //结束时间处于18-24
                    {
                        ts = endTime - sys_enddate2;
                        shichang1 = ts.TotalSeconds;
                    }

                }
                else //开始时间处于18:00-24:00


                {
                    ts = endTime - startTime;
                    shichang1 = ts.TotalSeconds;
                }

            }
            shichang = shichang1 + shichang2 + shichang3;
            if (shichang < 300) shichang = 0;
            return shichang.ToString();

        }




我这段代码,如果开始时间跟结束时间是同一天没问题,但如果跨天则会出现错误。

 string startDate = "2013-08-02 18:00:01";
 string endDate = "2013-08-03 12:33:51";

返回0,各位高手能不能帮忙改进下?
[解决办法]
private static TimeSpan t4 = TimeSpan.FromHours(18);
private static TimeSpan t3 = TimeSpan.FromHours(14);
private static TimeSpan t2 = TimeSpan.FromHours(12);
private static TimeSpan t1 = TimeSpan.FromHours(8);

private static double getShiChang(DateTime dateTime1, DateTime dateTime2)
{
    var result = 0D;
begin:
    if (dateTime1 >= dateTime2)
        return result;

    var wk = dateTime1.DayOfWeek;
    var dt = dateTime1.Date;
    var tm = dateTime1.TimeOfDay;
    if (wk == DayOfWeek.Saturday)
    {
        var mo = dt.AddDays(2).Add(t1);


        result += mo.Subtract(dateTime1).TotalSeconds;
        dateTime1 = mo;
    }
    else if (wk == DayOfWeek.Sunday 
[解决办法]
 tm >= t4)
    {
        var mo = dt.AddDays(1).Add(t1);
        result += mo.Subtract(dateTime1).TotalSeconds;
        dateTime1 = mo;
    }
    else if (tm >= t3)
        dateTime1 = dt.Add(t4);
    else if (tm >= t2)
    {
        result += tm.Subtract(t2).TotalSeconds;
        dateTime1 = dt.Add(t4);
    }
    else if (tm >= t1)
        dateTime1 = dt.Add(t2);
    else
    {
        result += t1.Subtract(tm).TotalSeconds;
        dateTime1 = dt.Add(t2);
    }
    goto begin;
}


[解决办法]
需求很明确,写起来也就容易了:
public long getShiChang(DateTime startdate, DateTime enddate)
{
    long res = 0;
    TimeSpan ts24 = TimeSpan.Parse("1.00:00:00");
    TimeSpan[] ts = new TimeSpan[]{
        TimeSpan.Parse("00:00"),  TimeSpan.Parse("08:00"),  
        TimeSpan.Parse("12:00"), TimeSpan.Parse("14:00"),  
        TimeSpan.Parse("18:00"), ts24,  
    };
    for (; startdate < enddate; startdate = startdate.Date.AddDays(1))
    {
        TimeSpan ts0 = startdate.TimeOfDay;
        TimeSpan ts1 = (startdate.Date.Equals(enddate.Date)) ? enddate.TimeOfDay : ts24;


        for (int i = 0; i < ts.Length; i += 2)
        {
            if (ts0 < ts[i + 1] && ts1 > ts[i])
            {
                TimeSpan tsa = ts0 < ts[i] ? ts[i] : ts0;
                TimeSpan tsb = ts1 > ts[i + 1] ? ts[i + 1] : ts1;
                res += (long)(tsb - tsa).TotalSeconds;
            }
        }
    }
    return res;
}

热点排行