当前位置:编程学习 > C#/ASP.NET >>

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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,