LINQ集合操作——计算工作时间

如何计算两个时间段的有效工作时间?比如("2010-08-10 9:00")和("2010-08-11 16:00")之间?

下面是刚刚得到的,没有考虑周末:


        public static int CalcWorkingHours(DateTime begin, DateTime end)
        {
            if (begin > end) return 0;
            // 忽略TimeSpan计算时的时间
            Func<DateTime, DateTime> ignoreTime = dt => new DateTime(dt.Year, dt.Month, dt.Day);
            // 时间段的集合
            Func<int, int, IEnumerable<int>> timeSet = (min, max) => Enumerable.Range(min, max - min);

            var days = (ignoreTime(end) - ignoreTime(begin)).Days;

            // 工作时间段
            var wh = timeSet(8, 12).Union(timeSet(14, 18));

            var hours =
                    days == 0 //是否是当天
                    ? timeSet(begin.Hour, end.Hour).Intersect(wh).Count()
                    : timeSet(begin.Hour, 24).Intersect(wh).Count() + timeSet(0, end.Hour).Intersect(wh).Count();

            return (days - 1) * wh.Count() + hours;
        }

网上有人问到这个有意思的问题,下班之后在公交车上想到了LINQ的做法。

工作时间的计算是上午4小时和下午4小时的并集。然后就简单了,有效工作时间就是全天某个时间段和工作时间两个序列的交集。

PS: C#中的TimeSpan计算有个要注意的地方,比如:


        var begin = DateTime.Parse("2010-08-10 20:00");
        var end = DateTime.Parse("2010-08-11 16:00");
            
        Console.WriteLine((end - begin).Days); // 输出:0
        Console.WriteLine((end - begin).TotalDays); // 输出:0.916666666666667

于是,要返回生活习惯上的天数间隔,必须要忽略掉时间,只以日期(年、月、日)计算。

转载于:https://www.cnblogs.com/ambar/archive/2010/08/13/linq-set-operation-calc-working-hours.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值