停车场收费算法,思路卡住了求补完!!

bulls5988 2013-11-22 03:59:17
一个停车场算法,写了一半不会写了。
需求:员工停车卡。周一到周五,7:00~23:00免费,其余部分每小时收费2元。周六日每小时2元,无免费时间。(需要考虑多天跨天的情况,这里有点不会写了)。求大神帮助补完下代码

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;//函数返回总费用
}
...全文
1298 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
bulls5988 2013-11-26
  • 打赏
  • 举报
回复
好吧 我按照自己的思路重发一下 大神的思路还是跟不太上的
鸭梨山大帝 2013-11-26
  • 打赏
  • 举报
回复
这个不涉及到什么高深算法,之所以写不出来是楼主没厘清计费情况到底有几种.
E次奥 2013-11-26
  • 打赏
  • 举报
回复
引用 30 楼 bulls5988 的回复:
15分钟啊,比如:周一到周五期间。6:50来23:10走;总共在免费时段外时间超过了15分钟(已经20分钟了),算一小时
那你为什么不一刻钟收一次费呢?
Saleayas 2013-11-26
  • 打赏
  • 举报
回复
全场收费。 免费时段,赠送。
bulls5988 2013-11-26
  • 打赏
  • 举报
回复
15分钟啊,比如:周一到周五期间。6:50来23:10走;总共在免费时段外时间超过了15分钟(已经20分钟了),算一小时
tcmakebest 2013-11-26
  • 打赏
  • 举报
回复
我感觉就是来抢分的,哎,但这个方法太好用了,返回分钟数:
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;
}
E次奥 2013-11-26
  • 打赏
  • 举报
回复
引用 27 楼 bulls5988 的回复:
这个算法基本可行了 就是差免费时段外超过15分钟算一小时费用这个问题了
引用 26 楼 tcmakebest 的回复:
如果楼主只想写一个函数来计算肯定没戏,应该尝试层层分解,把大问题化解为小问题解决。
那你说超过多长时间按一小时算?
bulls5988 2013-11-26
  • 打赏
  • 举报
回复
这个算法基本可行了 就是差免费时段外超过15分钟算一小时费用这个问题了
引用 26 楼 tcmakebest 的回复:
如果楼主只想写一个函数来计算肯定没戏,应该尝试层层分解,把大问题化解为小问题解决。
tcmakebest 2013-11-26
  • 打赏
  • 举报
回复
如果楼主只想写一个函数来计算肯定没戏,应该尝试层层分解,把大问题化解为小问题解决。
bulls5988 2013-11-26
  • 打赏
  • 举报
回复
老大你这个算法很诡异啊,2013-11-25是周一。进场时间为6:59:59 出场时间为 23:00:00 只超出了一秒钟。总费用就由0元变4元了为什么?每小时只有2元车费,为什么超出一秒变成4元了呢?
引用 13 楼 sp1234 的回复:
还是有 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);
}
bulls5988 2013-11-26
  • 打赏
  • 举报
回复
对不起 我参数填错了 想填2013-11-23 结果给的是2012-11-23
bulls5988 2013-11-26
  • 打赏
  • 举报
回复
引用 22 楼 danding_ge 的回复:
[quote=引用 20 楼 bulls5988 的回复:] 求大神,大神来呀...
引用 19 楼 yuwenge 的回复:
停车场收费老大爷表示这种费用看看天就能算出来。
看到没?去问问停车场收费的老大爷![/quote] 妹的老大爷会给我写算法么~
公西雒 2013-11-26
  • 打赏
  • 举报
回复
引用 20 楼 bulls5988 的回复:
求大神,大神来呀...
引用 19 楼 yuwenge 的回复:
停车场收费老大爷表示这种费用看看天就能算出来。
看到没?去问问停车场收费的老大爷!
jiaoshiyao 2013-11-26
  • 打赏
  • 举报
回复
引用 1 楼 feiyun0112 的回复:
建3个类,每个类都继承ICalc A1--周一到周五,7:00~23:00 A2--周一到周五,其余 A3--周六日 从start_time到end_time,按天实例化A1---A3存到数组 寻欢调用ICalc,sum ***************************************************************************** 签名档: http://feiyun0112.cnblogs.com/
建三个类。。。越简单越好啊。。。
bulls5988 2013-11-26
  • 打赏
  • 举报
回复
求大神,大神来呀...
卧_槽 2013-11-25
  • 打赏
  • 举报
回复
停车场收费老大爷表示这种费用看看天就能算出来。
bulls5988 2013-11-25
  • 打赏
  • 举报
回复
老大你这个 return 2 * (int)Math.Ceiling(dateTime2.Subtract(dateTime1).TotalHours); 应该是收费标准2元/小时吧,现在停车时间为11月24日5点~11月25日11:35返回值为86,应该为56才对;周日5~24点19小时收费,周一0~7点,7小时收费,晚上23:00~23:35超过15分钟收一小时。
引用 13 楼 sp1234 的回复:
还是有 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);
}
wang1234587 2013-11-24
  • 打赏
  • 举报
回复
厉害,小弟实在佩服啊
bulls5988 2013-11-23
  • 打赏
  • 举报
回复
老大费心了,一会回家调试现在在外边干活呢
引用 15 楼 sp1234 的回复:
显然,就是这个“周一到周五”最麻烦。 我没有做任何优化,因为这样写最清楚。简单说明一下
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点
  • 打赏
  • 举报
回复
显然,就是这个“周一到周五”最麻烦。 我没有做任何优化,因为这样写最清楚。简单说明一下
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点
加载更多回复(12)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧