判断一个时间段内出现另一个时间段几次

 #region 计算休息时间
        public static List<InspectSleepTime> _inspectSleepTimes = GetSleepStandardTime();

        public static List<InspectSleepTime> GetSleepStandardTime()
        {
            List<InspectSleepTime> inspectSleepTimes = new List<InspectSleepTime>();
            // 00:00 - 00:30
            inspectSleepTimes.Add(new InspectSleepTime()
            {
                SortOrder = 1,
                StartTime4Minute = 0,
                EndTime4Minute = 30
            });

            // 05:00 - 6:30
            inspectSleepTimes.Add(new InspectSleepTime()
            {
                SortOrder = 2,
                StartTime4Minute = 5 * 60,
                EndTime4Minute = 6 * 60 + 30
            });

            // 12:00 - 13:30
            inspectSleepTimes.Add(new InspectSleepTime()
            {
                SortOrder = 3,
                StartTime4Minute = 12 * 60,
                EndTime4Minute = 13 * 60 + 30
            });

            // 18:00 - 18:30
            inspectSleepTimes.Add(new InspectSleepTime()
            {
                SortOrder = 4,
                StartTime4Minute = 18 * 60,
                EndTime4Minute = 18 * 60 + 30
            });
            return inspectSleepTimes;
        }

        private static int DateDiff(DateTime dateStart, DateTime dateEnd)
        {
            DateTime start = Convert.ToDateTime(dateStart.ToShortDateString());
            DateTime end = Convert.ToDateTime(dateEnd.ToShortDateString());

            TimeSpan sp = end.Subtract(start);

            return sp.Days;
        }

        public static int CountInspectSleepMinute(DateTime deliveryTime, DateTime inspectTime)
        {
            if (deliveryTime == null || inspectTime == null)
            {
                return 0;
            }

            if (inspectTime < deliveryTime)
            {
                return 0;
            }

            int tardyMinutes = 0;

            // 日期差
            int diffrentDay = DateDiff(deliveryTime, inspectTime);

            // 没有跨天
            if (diffrentDay < 1)
            {
                tardyMinutes = GetOneDaySleepMinute(deliveryTime, inspectTime);
            }
            // 有跨天
            else
            {
                tardyMinutes += GetOneDaySleepMinute(deliveryTime, Convert.ToDateTime(deliveryTime.ToShortDateString()).AddDays(1).AddTicks(-1));
                tardyMinutes += GetOneDaySleepMinute(Convert.ToDateTime(inspectTime.ToShortDateString()), inspectTime);
                // 跨天大于1天
                if (diffrentDay > 1)
                {
                    DateTime dateTimeTemp = DateTime.Today;
                    int oneDaySleepTime = GetOneDaySleepMinute(dateTimeTemp, dateTimeTemp.AddDays(1).AddTicks(-1));
                    ; tardyMinutes += (diffrentDay - 1) * oneDaySleepTime;
                }

            }
            return tardyMinutes;
        }

        public static int GetOneDaySleepMinute(DateTime startTime, DateTime endTime)
        {
            if (Convert.ToDateTime(startTime.ToShortDateString()) != Convert.ToDateTime(endTime.ToShortDateString()))
            {
                throw new Exception("请勿计算不在同一天的时间");
            }

            int awaitCountStartTime4Minute = startTime.Hour * 60 + startTime.Minute;
            int awaitCountEndTime4Minute = endTime.Hour * 60 + endTime.Minute;

            if (_inspectSleepTimes == null)
            {
                _inspectSleepTimes = GetSleepStandardTime();
            }

            int startTimeCountMinute = 0;
            for (int i = 0; i < _inspectSleepTimes.Count; i++)
            {
                if (awaitCountStartTime4Minute < _inspectSleepTimes[i].StartTime4Minute)
                {
                    startTimeCountMinute = _inspectSleepTimes
                        .Where(p => p.SortOrder >= _inspectSleepTimes[i].SortOrder)
                        .Sum(p => p.EndTime4Minute - p.StartTime4Minute);
                    break;
                }
                else if (awaitCountStartTime4Minute < _inspectSleepTimes[i].EndTime4Minute)
                {
                    startTimeCountMinute = _inspectSleepTimes[i].EndTime4Minute - awaitCountStartTime4Minute;
                    startTimeCountMinute += _inspectSleepTimes
                        .Where(p => p.SortOrder > _inspectSleepTimes[i].SortOrder)
                        .Sum(p => p.EndTime4Minute - p.StartTime4Minute);
                    break;
                }
            }

            int endTimeCountMinute = 0;
            for (int i = 0; i < _inspectSleepTimes.Count; i++)
            {
                if (awaitCountEndTime4Minute < _inspectSleepTimes[i].StartTime4Minute)
                {
                    endTimeCountMinute = _inspectSleepTimes
                        .Where(p => p.SortOrder >= _inspectSleepTimes[i].SortOrder)
                        .Sum(p => p.EndTime4Minute - p.StartTime4Minute);
                    break;
                }
                else if (awaitCountEndTime4Minute < _inspectSleepTimes[i].EndTime4Minute)
                {
                    endTimeCountMinute = _inspectSleepTimes[i].EndTime4Minute - awaitCountEndTime4Minute;
                    endTimeCountMinute += _inspectSleepTimes
                        .Where(p => p.SortOrder > _inspectSleepTimes[i].SortOrder)
                        .Sum(p => p.EndTime4Minute - p.StartTime4Minute);
                    break;
                }
            }

            return startTimeCountMinute - endTimeCountMinute;
        }

        #endregion
 public class InspectSleepTime
    {
        public virtual int StartTime4Minute { get; set; }
        public virtual int SortOrder { get; set; }
        public virtual int EndTime4Minute { get; set; }
    }
//调用

DateTime inspectDateTime = DateTime.Parse(item.InspectTime.Value.ToString("yyyy/MM/dd HH:mm"));
                    DateTime deliveryDateTime = DateTime.Parse(item.SupplierCreationDate.ToString("yyyy/MM/dd HH:mm"));

                    TimeSpan endTimeSpan = new TimeSpan(inspectDateTime.Ticks);
                    TimeSpan startTimeSpan = new TimeSpan(deliveryDateTime.Ticks);

                    double sleepHours = Convert.ToDouble(CountInspectSleepMinute(deliveryDateTime, inspectDateTime)) / 60;
                    double differenceTime = (endTimeSpan - startTimeSpan).TotalHours - sleepHours;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值