#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;