110,533
社区成员
发帖
与我相关
我的任务
分享
public int staff_times(DateTime start_time, DateTime end_time)//开始停车时间,
停车结束时间
{
int fee = 0;//总收费数
int day = 0;//一共间隔了几天
DateTime dt1 = start_time.Date.AddHours(7);//取得入场时间当日7点
DateTime dt2 = start_time.Date.AddHours(23).AddMinutes(1);//取得入场时间当日23点
staff_card staff_week = new staff_card();
string today_week = staff_week.Weeks_time().ToString();//返回数据库时间为周几
int Total_hour = 0;//总停车收费小时数
if (today_week != "周六" && today_week != "周日")//如果不是周六日
{
if (start_time >= dt1 && end_time <= dt2)//如果在免费时段内
{
Total_hour = 0;//收费小时为0
}
else
{
//如果在免费时段外
TimeSpan ts = (dt1 - start_time) + (end_time - dt2);
if (ts.Minutes > 15)
{
Total_hour = (int)(ts.Hours) + 1;
//超出15分钟算1小时
}
else
{
Total_hour = (int)(ts.Hours);
//未超出15分钟算0小时
}
}
}
else //如果是周六日,没有免费时间
{
TimeSpan ts = end_time - start_time;
if (ts.Minutes > 15)
{
Total_hour = (int)(ts.Hours) + 1;
//超出15分钟算1小时
}
else
{
Total_hour = (int)(ts.Hours);
//未超出15分钟算0小时
}
}
fee = Total_hour * 2;//收费小时数每小时2元,算总费用
return fee;//函数返回总费用
}
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("07:00"),
TimeSpan.Parse("23:00"), ts24,
};
for (; startdate < enddate; startdate = startdate.Date.AddDays(1))
{
TimeSpan ts0 = startdate.TimeOfDay;
TimeSpan ts1 = (startdate.Date.Equals(enddate.Date)) ? enddate.TimeOfDay : ts24;
switch (startdate.DayOfWeek)
{
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
res += (long)(ts1 - ts0).TotalSeconds;
break;
default:
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;
}
}
break;
}
}
return res / 60;
}
如果楼主只想写一个函数来计算肯定没戏,应该尝试层层分解,把大问题化解为小问题解决。
还是有 bug,呵呵,再修改一下private static int staff_times(DateTime dateTime1, DateTime dateTime2) { if (dateTime1 >= dateTime2) return 0; var wk = dateTime1.DayOfWeek; switch (wk) { case DayOfWeek.Saturday: case DayOfWeek.Sunday: return staff_times1(dateTime1, dateTime2); default: return staff_times2(dateTime1, dateTime2); } } /// <summary> /// 开始时间是周一到周五处理 /// </summary> /// <param name="dateTime1"></param> /// <param name="dateTime2"></param> /// <returns></returns> private static int staff_times2(DateTime dateTime1, DateTime dateTime2) { var t1 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 7, 0, 0); var t2 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 23, 0, 0); if (dateTime1 < t1) { if (dateTime2 < t1) return 2 * (int)Math.Ceiling(dateTime2.Subtract(dateTime1).TotalHours); else return 2 * (int)Math.Ceiling(t1.Subtract(dateTime1).TotalHours) + staff_times2(t2, dateTime2); //早晨这段时间收费+晚上这段时间收费 } else if (dateTime2 < t2) //7点到23点之间免费 return 0; else if (dateTime1 < t2) return staff_times(t2, dateTime2); else return 2 + staff_times(dateTime1.AddHours(1), dateTime2); } /// <summary> /// 开始时间是周六日处理 /// </summary> /// <param name="dateTime1"></param> /// <param name="dateTime2"></param> /// <returns></returns> private static int staff_times1(DateTime dateTime1, DateTime dateTime2) { return 2 + staff_times(dateTime1.AddHours(1), dateTime2); }
[quote=引用 20 楼 bulls5988 的回复:] 求大神,大神来呀...
停车场收费老大爷表示这种费用看看天就能算出来。
求大神,大神来呀...
停车场收费老大爷表示这种费用看看天就能算出来。
建3个类,每个类都继承ICalc A1--周一到周五,7:00~23:00 A2--周一到周五,其余 A3--周六日 从start_time到end_time,按天实例化A1---A3存到数组 寻欢调用ICalc,sum ***************************************************************************** 签名档: http://feiyun0112.cnblogs.com/
还是有 bug,呵呵,再修改一下private static int staff_times(DateTime dateTime1, DateTime dateTime2) { if (dateTime1 >= dateTime2) return 0; var wk = dateTime1.DayOfWeek; switch (wk) { case DayOfWeek.Saturday: case DayOfWeek.Sunday: return staff_times1(dateTime1, dateTime2); default: return staff_times2(dateTime1, dateTime2); } } /// <summary> /// 开始时间是周一到周五处理 /// </summary> /// <param name="dateTime1"></param> /// <param name="dateTime2"></param> /// <returns></returns> private static int staff_times2(DateTime dateTime1, DateTime dateTime2) { var t1 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 7, 0, 0); var t2 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 23, 0, 0); if (dateTime1 < t1) { if (dateTime2 < t1) return 2 * (int)Math.Ceiling(dateTime2.Subtract(dateTime1).TotalHours); else return 2 * (int)Math.Ceiling(t1.Subtract(dateTime1).TotalHours) + staff_times2(t2, dateTime2); //早晨这段时间收费+晚上这段时间收费 } else if (dateTime2 < t2) //7点到23点之间免费 return 0; else if (dateTime1 < t2) return staff_times(t2, dateTime2); else return 2 + staff_times(dateTime1.AddHours(1), dateTime2); } /// <summary> /// 开始时间是周六日处理 /// </summary> /// <param name="dateTime1"></param> /// <param name="dateTime2"></param> /// <returns></returns> private static int staff_times1(DateTime dateTime1, DateTime dateTime2) { return 2 + staff_times(dateTime1.AddHours(1), dateTime2); }
显然,就是这个“周一到周五”最麻烦。 我没有做任何优化,因为这样写最清楚。简单说明一下需要考虑5种情况: 1. datetime1早于7点,datatime2早于7点 2. datetime1早于7点,datatime2晚于7点 3. datetime1晚于7点,datatime2早于当天的23点 4. datetime1晚于7点但是早于23点,datatime2晚于当天的23点 5. datetime1晚于当天23点,datatime2晚于当天的23点private static int staff_times2(DateTime dateTime1, DateTime dateTime2) { var t1 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 7, 0, 0); var t2 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 23, 0, 0); if (dateTime1 < t1) { if (dateTime2 < t1) return 2 * (int)Math.Ceiling(dateTime2.Subtract(dateTime1).TotalHours); else return 2 * (int)Math.Ceiling(t1.Subtract(dateTime1).TotalHours) + staff_times2(t2, dateTime2); //早晨这段时间收费+晚上这段时间收费 } else if (dateTime2 < t2) //7点到23点之间免费 return 0; else if (dateTime1 < t2) return staff_times2(t2, dateTime2); else return 2 + staff_times(dateTime1.AddHours(1), dateTime2); }
private static int staff_times2(DateTime dateTime1, DateTime dateTime2)
{
var t1 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 7, 0, 0);
var t2 = new DateTime(dateTime1.Year, dateTime1.Month, dateTime1.Day, 23, 0, 0);
if (dateTime1 < t1)
{
if (dateTime2 < t1)
return 2 * (int)Math.Ceiling(dateTime2.Subtract(dateTime1).TotalHours);
else
return 2 * (int)Math.Ceiling(t1.Subtract(dateTime1).TotalHours) + staff_times2(t2, dateTime2); //早晨这段时间收费+晚上这段时间收费
}
else if (dateTime2 < t2) //7点到23点之间免费
return 0;
else if (dateTime1 < t2)
return staff_times2(t2, dateTime2);
else
return 2 + staff_times(dateTime1.AddHours(1), dateTime2);
}
需要考虑5种情况:
1. datetime1早于7点,datatime2早于7点
2. datetime1早于7点,datatime2晚于7点
3. datetime1晚于7点,datatime2早于当天的23点
4. datetime1晚于7点但是早于23点,datatime2晚于当天的23点
5. datetime1晚于当天23点,datatime2晚于当天的23点