现在有开始和截止2个变量。start_time、end_time把24小时分成2段 当日:09:00 - 21:00 次日(1时段) 21:01-08:59 (2时段)开始时间和截止时间 1时段中。按每小时4元收费。超过15分钟 1小时计算 不足15分钟 按0小时计算 。在2时段中,共收费30元。不再按小时收费既在1时段又在2时段的部分,1时段部分每小时4元。2时段部分,共收费30元。总费用相加。 如果是多天也按这个计算。大神给的算法:ojlovecd大神,给我的算法好像有点问题。如:2011-05-10 22:30 到 2011-05-11 22:30。应该是24小时。
2011-05-10 22:30 到 2011-05-11 08:59  在时段2中 就是30元 9:00-20:59 12小时应收12*4 =48
11日21:00 - 22:30也在时段2内也是30元。加起来应该是 108元 现在结果却是60元。 public int GetFee(DateTime start_time, DateTime end_time)
        {
            int fee = 0;
            DateTime dt1 = start_time.Date.AddHours(9);
            DateTime dt2 = start_time.Date.AddHours(21);
            for (DateTime dt = start_time; dt < end_time; )
            {                if (dt < dt1)
                {
                    fee += 30;
                    dt = dt1;
                    dt1 = dt1.AddDays(1);
                    if (dt >= end_time)
                        break;
                    if (start_time > dt1)
                        dt1 = dt1.AddDays(1).Date.AddHours(9);                    if (dt2 > end_time)
                        dt2 = end_time;                }
                else if (dt2 > end_time)
                    dt2 = end_time;
               
                if (dt < dt2)
                {
                    TimeSpan ts = dt2 - dt;
                    int hours = (int)ts.TotalHours;
                    fee += hours * 4;
                    if (ts.Minutes > 15)
                        fee += 4;
                    dt = dt2;
                    dt2 = dt2.AddDays(1);
                }                if (start_time > dt1)
                    dt1 = dt1.AddDays(1).Date.AddHours(9);                if (dt2 > end_time)
                    dt2 = end_time;
            }
            return fee;
        }

解决方案 »

  1.   

    private string[] SplitDouble(double d)
        {
            string   strD   =   System.Math.Abs(d).ToString();
            return strD.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
        }
        private int GetDayFee(double s_time, double e_time)
        {
            double t = e_time - s_time;
            string[] s = SplitDouble(t);
            
            int day = int.Parse(s[0]);
            if (s.Length == 2 && int.Parse(s[1]) >= 25)
            {
                day += 1;
            }
            return day * 4;
        }
        public int GetFee(DateTime start_time, DateTime end_time)
        {
            int fee = 0;
            
            start_time=start_time.Subtract(new TimeSpan(9,0,0));
            end_time=end_time.Subtract(new TimeSpan(9,0,0));
            double ds_time = (start_time.Hour + start_time.Minute / 60.0);
            double de_time = (end_time.Hour + end_time.Minute / 60.0);
            double Thour = end_time.Subtract(start_time).TotalHours;        if (Thour > 12.0 && Thour < 24.0)
            {
                if (start_time.Hour < 12)
                {
                    fee += GetDayFee(ds_time, 12) + 30;
                }
                else
                {
                    fee += 30 + GetDayFee( 0.0,de_time);
                }
            }
            else
            {
                if (start_time.Hour < 12&&end_time.Hour<12)
                {
                    fee = GetDayFee(ds_time, de_time);
                }
                else if (start_time.Hour > 12 && end_time.Hour > 12)
                {
                    fee = 30;
                }
                else
                {
                    if (start_time.Hour < 12)
                    {
                        fee = GetDayFee(ds_time, 12) + 30;
                    }
                    else
                    {
                        fee = 30 + GetDayFee(0.0, ds_time);
                    }
                }        }
            return fee;
        }唯一缺点是没有处理在超过24小时的部分,也不知道有没有写错...忘不吝赐教
      

  2.   

    是有问题,自己的问题我自己来解决,主要是少了一个条件造成的,你再试试:        static int GetFee(DateTime start_time, DateTime end_time)
            {
                int fee = 0;
                DateTime dt1 = start_time.Date.AddHours(9);
                DateTime dt2 = start_time.Date.AddHours(21).AddMinutes(1);
                for (DateTime dt = start_time; dt < end_time; )
                {                if (dt < dt1)
                    {
                        fee += 30;
                        dt = dt1;
                        dt1 = dt1.AddDays(1);
                        if (dt >= end_time)
                            break;
                        if (start_time > dt1)
                            dt1 = dt1.AddDays(1).Date.AddHours(9);
                        if (dt > dt2)
                            dt2 = dt2.AddDays(1);
                        if (dt2 > end_time)
                            dt2 = end_time;                }
                    else if (dt2 > end_time)
                        dt2 = end_time;
                    if (dt < dt2)
                    {
                        TimeSpan ts = dt2 - dt;
                        int hours = (int)ts.TotalHours;
                        fee += hours * 4;
                        if (ts.Minutes > 15)
                            fee += 4;
                        dt = dt2;
                        dt2 = dt2.AddDays(1);
                    }
                    if (start_time > dt1)
                        dt1 = dt1.AddDays(1).Date.AddHours(9);                if (dt2 > end_time)
                        dt2 = end_time;            }
                return fee;
            }
      

  3.   

    TimeSpan ts = end_time - endtime.Date.AddHours(21);
    if(ts.TotalHours > 3)
    {}
      

  4.   


            static int GetFee(DateTime start_time, DateTime end_time)
            {
                int fee = 0;
                int hour = 5;//如果以后你们领导又要改,就改这个时间吧
                DateTime dt1 = start_time.Date.AddHours(9);
                DateTime dt2 = start_time.Date.AddHours(21).AddMinutes(1);
                for (DateTime dt = start_time; dt < end_time; )
                {                if (dt < dt1)
                    {
                        if ((dt1 - dt).TotalHours > hour)
                        {
                            fee += 30;
                            dt = dt1;
                            dt1 = dt1.AddDays(1);
                            if (dt >= end_time)
                                break;
                            if (start_time > dt1)
                                dt1 = dt1.AddDays(1).Date.AddHours(9);
                            if (dt > dt2)
                                dt2 = dt2.AddDays(1);
                            if (dt2 > end_time)
                                dt2 = end_time;
                        }
                        else if (dt2 > end_time)
                            dt2 = end_time;
                    }
                    else if (dt2 > end_time)
                        dt2 = end_time;
                    if (dt < dt2)
                    {
                        if ((end_time - dt2).TotalHours <= hour)
                            dt2 = end_time;
                        TimeSpan ts = dt2 - dt;
                        int hours = (int)ts.TotalHours;
                        fee += hours * 4;
                        if (ts.Minutes > 15)
                            fee += 4;
                        dt = dt2;
                        dt2 = dt2.AddDays(1);
                    }
                    if (dt > dt1)
                        dt1 = dt1.AddDays(1).Date.AddHours(9);                if (dt2 > end_time)
                        dt2 = end_time;            }
                return fee;
            }