是这样滴,因为设置里面,就是包夜起始结束时间,这个只是时间段,没有日期,所以,我1开始想用时间段来区别设置,结果失败了,基本不可能.因为包夜有的地方是跨天,23.00-7.00 有的是 1.00-7.30 这个就很罗嗦了
想来想去想不出个好办法
private void Mone() { //此处,如果出现2个包夜时段,会出错...........就是跨了2天以上........ try { //收费多少元 int money = 0; //进出时间 DateTime intime, outtime; intime = inTime.Value; outtime = outTime.Value; //免费分钟数 int nomoney; nomoney = int.Parse(textBox1.Text); //起价分钟数 int startTime; startTime = int.Parse(textBox2.Text); //起价 int startMoney; startMoney = int.Parse(textBox3.Text); //步进时间 int stepTime; stepTime = int.Parse(textBox4.Text); //步进价格 int stepMoney; stepMoney = int.Parse(textBox5.Text); //包夜价格 int nightMoney; nightMoney = int.Parse(textBox6.Text); //包夜时长 int nightTime; nightTime = int.Parse(textBox9.Text); //包夜有隔天 bool isNextDay; isNextDay = checkBox1.Checked; //第一次累加 bool isFirst = true; //最小包夜时间 int minNight; minNight = int.Parse(textBox7.Text); //包夜开始时间,结束时间 DateTime bystart, byend; if (isNextDay) { //包夜时段是隔天的 byend = byout.Value; //日期部分,当日 bystart = byin.Value; //日期部分,当日 if (byend < intime & intime < bystart & byend < outtime & outtime < bystart) { //上机时间没有包夜,正常计费 TimeSpan ts = outtime - intime; int minu = (int)ts.TotalMinutes; //用了多少分钟 if (minu <= nomoney) //免费分钟内,不收费 { money = 0; } else if (minu > nomoney & minu < startTime)//超过免费分钟,小于起价时间 { money = startMoney;//起步价 } else if (minu > startTime)//超过起价时间 { // (总时间-起价时间)/步进时间 向上取整(不足步进时间,按步进时间算) * 步进价格 + 起价 // Math.Floor 向下取整 money = ((int)Math.Ceiling((double)((minu - startTime) / stepTime))) * stepMoney + startMoney; } } else { //上机时间有包夜 //循环累加进场时间,每累加1次,判定各种条件 while (intime < outtime)//一直循环,直到等式不成立 { if (byend < intime & intime < bystart)//未进入包夜时段的计费 { if (isFirst) //第一次累加,要算基本费(起价) { TimeSpan tp = bystart - intime; int minu = (int)tp.TotalMinutes; //用了多少分钟 if (minu < nomoney) //免费分钟内,不收费 { money = 0; } else if (minu > nomoney & minu < startTime)//超过免费分钟,小于起价时间 { money = startMoney;//起步价 intime = intime.AddMinutes(startTime); } else if (minu > startTime)//超过起价时间 { money = startMoney; intime = intime.AddMinutes(startTime); } isFirst = false; } else //算过起价之后 { TimeSpan tp = bystart - intime; int minu = (int)tp.TotalMinutes; //用了多少分钟 money += stepMoney; intime = intime.AddMinutes(stepTime); isFirst = false; } } else if (intime >= bystart & intime <= byend.AddDays(1) || bystart.AddDays(-1) < intime & intime < byend) //包夜时段跨天,结束包夜时间,日期+1 { //进入包夜计费时段 //先判定,包夜时间长短,短的按正常计费 TimeSpan tn = byend - intime;//此处的intime是累加过的,不是初始的进来时间 if ((int)tn.TotalMinutes < minNight) // 在包夜时间段内的停留时间,小于最小包夜时间,按正常收费 { TimeSpan mints = intime - bystart; int minu = (int)mints.TotalMinutes; if (minu >= stepTime)//超过步进时间 { money += stepMoney; } //正常收费,每次循环增加标准步进时间间隔 intime = intime.AddMinutes(stepTime); } else//超过最小包夜时间,收取全部包夜费 { money += nightMoney; intime = intime.AddMinutes((int)(byend - intime).TotalMinutes); } } }//while } } else //包夜不隔天 { } textBox8.Text = money.ToString(); } catch (Exception ex) { throw ex; } }