c#写个分时段计费,代码如何实现,给小弟个思路
想写个分时间段计费的功能,但是一直没想明白怎么实现,请各位牛牛给个想法。比如: 13点-17点 10元/小时
17点-20点 15元/小时
那如果从16点开始计费到19点结束计费。横跨2个时间段,收费代码怎么写。 --------------------编程问答-------------------- 比较下当前时间的范围嘛 --------------------编程问答-------------------- int sum = Enumerable.Range(1, 12).Select(t => 0).Concat(Enumerable.Range(13, 4).Select(t => 10)).Concat(Enumerable.Range(17, 4).Select(t => 15)).Skip(16-1).Take(19-16).Sum();
--------------------编程问答-------------------- 还是没看懂 --------------------编程问答-------------------- 记录下登录时间和退出时间。
如果两个时间点在同一个时间段里,该怎么计费就怎么计费。
如果跨时间段,比如我在16点登录,18点退出。
那么计费应该是 (17-16)*10+(18-17)*15
不是整点的操作,可以按照分钟来计算,四舍五入还是怎样,看客户的需求即可。 --------------------编程问答-------------------- 可能还有一些BUG ,看着修改下吧
//时间段收费区域要顺序存放
List<TimeRegionCost> costs = new List<TimeRegionCost>()
{
new TimeRegionCost
{
Begin = new TimeSpan(13, 0, 0),
End = new TimeSpan(17, 0, 0),
Cost = 10
},
new TimeRegionCost
{
Begin = new TimeSpan(17, 0, 0),
End = new TimeSpan(20, 0, 0),
Cost = 15
}
};
double cost = GetCost(costs, new DateTime(2013, 3, 11, 15, 30, 0), new DateTime(2013, 3, 11, 19, 30, 0));
/// <summary>
/// 计算整体花费
/// </summary>
/// <param name="lists"></param>
/// <param name="begin"></param>
/// <param name="end"></param>
/// <returns></returns>
public double GetCost(List<TimeRegionCost> lists, DateTime begin, DateTime end)
{
if (end.DayOfYear > begin.DayOfYear)
{
//此处只处理两天的情况,多天一起的情况没有考虑
double lastCount = CountCost(lists, begin.TimeOfDay, new TimeSpan(24, 0, 0));
lastCount += CountCost(lists, new TimeSpan(0, 0, 0), end.TimeOfDay);
return lastCount;
}
return CountCost(lists, begin.TimeOfDay, end.TimeOfDay);
}
/// <summary>
/// 计算同一天内的花费
/// </summary>
/// <param name="lists"></param>
/// <param name="begin"></param>
/// <param name="end"></param>
/// <returns></returns>
public double CountCost(List<TimeRegionCost> lists, TimeSpan begin, TimeSpan end)
{
double lastCost = 0;
foreach (var item in lists)
{
if (item.Begin <= begin && end <= item.End)
{
lastCost += (end.TotalHours - begin.TotalHours) * item.Cost;
break;
}
if (item.Begin <= begin && end > item.End)
{
lastCost += (item.End.TotalHours - begin.TotalHours) * item.Cost;
//修正begin
begin = item.End;
}
}
return lastCost;
}
public class TimeRegionCost
{
public TimeSpan Begin { get; set; }
public TimeSpan End { get; set; }
public double Cost { get; set; }
}
补充:.NET技术 , C#