停车场收费算法,思路卡住了求补完!!
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;//函数返回总费用
}
[解决办法]
不要被跨天搞混!
不管他跨步跨天,进入停车场开始计费,每隔一小时,根据日期和时间收取一次费用!
出停车场结束计费!
[解决办法]
+1,主要是提取出该收钱的时间和不收钱的时间分为2类。
[解决办法]
直接按小时循环,然后判断是不是周一到周五,7:00~23:00,不是就+2元,计算机这么快,1000年也就一瞬间
不需要任何算法
[解决办法]
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)
return 2 * (int)Math.Ceiling(t1.Subtract(dateTime1).TotalHours) + staff_times2(t2, dateTime2); //早晨这段时间收费+晚上这段时间收费
else if (dateTime2 < t2) //7点到23点之间免费
return 0;
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);
}
[解决办法]
有 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)
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);
}
[解决办法]
return staff_times(t2, dateTime2);
写为
return staff_times2(t2, dateTime2);
更直接一些。虽然这样写也不会有任何bug出现。
[解决办法]
还是有 bug,呵呵,再修改一下
[解决办法]
显然,就是这个“周一到周五”最麻烦。
我没有做任何优化,因为这样写最清楚。简单说明一下
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点
[解决办法]
厉害,小弟实在佩服啊
[解决办法]
停车场收费老大爷表示这种费用看看天就能算出来。
[解决办法]
建三个类。。。越简单越好啊。。。
[解决办法]
看到没?去问问停车场收费的老大爷!
[解决办法]
如果楼主只想写一个函数来计算肯定没戏,应该尝试层层分解,把大问题化解为小问题解决。
[解决办法]
那你说超过多长时间按一小时算?
[解决办法]
我感觉就是来抢分的,哎,但这个方法太好用了,返回分钟数:
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;
}
[解决办法]
全场收费。
免费时段,赠送。
[解决办法]
15分钟啊,比如:周一到周五期间。6:50来23:10走;总共在免费时段外时间超过了15分钟(已经20分钟了),算一小时
那你为什么不一刻钟收一次费呢?
[解决办法]
这个不涉及到什么高深算法,之所以写不出来是楼主没厘清计费情况到底有几种.