现在有开始和截止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;
}
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;
}
{
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小时的部分,也不知道有没有写错...忘不吝赐教
{
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;
}
if(ts.TotalHours > 3)
{}
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;
}