using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TProduct.Common { public class WorkTimeHelper { private string _amWorkStartTime = "08:30";//上午工作开始时间 private string _amWorkEndTime = "12:00";//上午工作结束时间 private string _pmWorkStartTime = "13:30";//下午工作开始时间 private string _pmWorkEndTime = "17:00";//下午工作结束时间 private bool _isSundayRest = true;//周日是否休息 private bool _isMondayRest = false;//周一是否休息 private bool _isTuesdayRest = false;//周二是否休息 private bool _isWednesdayRest = false;//周三是否休息 private bool _isThursdayRest = false;//周四是否休息 private bool _isFridayRest = false;//周五是否休息 private bool _isSaturdayRest = true;//周六是否休息 private bool _isOverTime = false;//是否考虑加班 /// /// 上午工作开始时间 /// public string AmWorkStartTime { get { return _amWorkStartTime; } set { _amWorkStartTime = value; } } /// /// 上午工作结束时间 /// public string AmWorkEndTime { get { return _amWorkEndTime; } set { _amWorkEndTime = value; } } /// /// 下午工作开始时间 /// public string PmWorkStartTime { get { return _pmWorkStartTime; } set { _pmWorkStartTime = value; } } /// /// 下午工作结束时间 /// public string PmWorkEndTime { get { return _pmWorkEndTime; } set { _pmWorkEndTime = value; } } /// /// 周日是否休息 /// public bool IsSundayRest { get { return _isSundayRest; } set { _isSundayRest = value; } } /// /// 周一是否休息 /// public bool IsMondayRest { get { return _isMondayRest; } set { _isMondayRest = value; } } /// /// 周二是否休息 /// public bool IsTuesdayRest { get { return _isTuesdayRest; } set { _isTuesdayRest = value; } } /// /// 周三是否休息 /// public bool IsWednesdayRest { get { return _isWednesdayRest; } set { _isWednesdayRest = value; } } /// /// 周四是否休息 /// public bool IsThursdayRest { get { return _isThursdayRest; } set { _isThursdayRest = value; } } /// /// 周五是否休息 /// public bool IsFridayRest { get { return _isFridayRest; } set { _isFridayRest = value; } } /// /// 周六是否休息 /// public bool IsSaturdayRest { get { return _isSaturdayRest; } set { _isSaturdayRest = value; } } /// /// 是否考虑加班 /// public bool IsOverTime { get { return _isOverTime; } set { _isOverTime = value; } } /// /// 计算一共经过了多少时间 /// /// /// public static double CalcWorkHour(DateTime StartTime) { return new WorkTimeHelper().Calc(StartTime, DateTime.Now); } public static double CalcWorkHour(DateTime StartTime, DateTime EndTime) { return new WorkTimeHelper().Calc(StartTime, EndTime); } /// /// 计算超过的时间 /// /// /// public static double _miniOverTime = 4; public static double CalcOverHour(DateTime StartTime) { var t = new WorkTimeHelper().Calc(StartTime, DateTime.Now); if (t < _miniOverTime) return 0; else return Math.Round(t - 4, 2); } public static double CalcOverHour(DateTime StartTime, DateTime EndTime) { return new WorkTimeHelper().Calc(StartTime, EndTime); } /// /// 计算指定时间段内的工作时间--以小时计 /// /// public double Calc(DateTime StartTime, DateTime EndTime) { //如果结束时间小于等于开始时间,返回负数 if (EndTime <= StartTime) return -1; //工作时间 TimeSpan amWorkStart = DateTime.Parse(AmWorkStartTime).TimeOfDay; TimeSpan amWorkEnd = DateTime.Parse(AmWorkEndTime).TimeOfDay; TimeSpan pmWorkStart = DateTime.Parse(PmWorkStartTime).TimeOfDay; TimeSpan pmWorkEnd = DateTime.Parse(PmWorkEndTime).TimeOfDay; var startNow = StartTime.TimeOfDay;//开始时间的时间节点 var endNow = EndTime.TimeOfDay;//结束时间的时间节点 double minorHoursStart = 0;//开始当天的零散时间 double minorHoursEnd = 0;//结束当天的零散时间 double manyHours = 0;//集成时间 double amWorkHours = amWorkEnd.Subtract(amWorkStart).TotalHours;//上午工作时间 double pmWorkHours = pmWorkEnd.Subtract(pmWorkStart).TotalHours;//下午工作时间 double workHours = amWorkHours + pmWorkHours;//一天的工作总时间 var diffDays = Convert.ToDateTime(EndTime.ToShortDateString()).Subtract(Convert.ToDateTime(StartTime.ToShortDateString())).Days;//相差天数 if (diffDays == 0)//表示开始和结束发生在同一天 { if (this.IsOverTime)//考虑加班情况 { if (startNow < amWorkStart) { if (endNow < amWorkStart) minorHoursStart = 0; if (endNow >= amWorkStart && endNow <= amWorkEnd) minorHoursStart = endNow.Subtract(amWorkStart).TotalHours; else if (endNow > amWorkEnd && endNow < pmWorkStart) minorHoursStart = amWorkHours; else if (endNow >= pmWorkStart) minorHoursStart = amWorkHours + endNow.Subtract(pmWorkStart).TotalHours; } else if (startNow >= amWorkStart && startNow <= amWorkEnd) { if (endNow > amWorkStart && endNow <= amWorkEnd) minorHoursStart = endNow.Subtract(startNow).TotalHours; else if (endNow > amWorkEnd && endNow < pmWorkStart) minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours; else if (endNow >= pmWorkStart) minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours + endNow.Subtract(pmWorkStart).TotalHours; } else if (startNow > amWorkEnd && startNow < pmWorkStart) { if (endNow > amWorkEnd && endNow < pmWorkStart) minorHoursStart = 0; else if (endNow >= pmWorkStart) minorHoursStart = endNow.Subtract(pmWorkStart).TotalHours; } else if (startNow >= pmWorkStart) minorHoursStart = endNow.Subtract(startNow).TotalHours; } else//不考虑加班情况 { if (startNow < amWorkStart) { if (endNow < amWorkStart) minorHoursStart = 0; if (endNow >= amWorkStart && endNow <= amWorkEnd) minorHoursStart = endNow.Subtract(amWorkStart).TotalHours; else if (endNow > amWorkEnd && endNow < pmWorkStart) minorHoursStart = amWorkHours; else if (endNow >= pmWorkStart && endNow <= pmWorkEnd) minorHoursStart = amWorkHours + endNow.Subtract(pmWorkStart).TotalHours; else minorHoursStart = workHours; } else if (startNow >= amWorkStart && startNow <= amWorkEnd) { if (endNow > amWorkStart && endNow <= amWorkEnd) minorHoursStart = endNow.Subtract(startNow).TotalHours; else if (endNow > amWorkEnd && endNow < pmWorkStart) minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours; else if (endNow >= pmWorkStart && endNow <= pmWorkEnd) minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours + endNow.Subtract(pmWorkStart).TotalHours; else minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours + pmWorkHours; } else if (startNow > amWorkEnd && startNow < pmWorkStart) { if (endNow > amWorkEnd && endNow < pmWorkStart) minorHoursStart = 0; else if (endNow >= pmWorkStart && endNow <= pmWorkEnd) minorHoursStart = endNow.Subtract(pmWorkStart).TotalHours; else minorHoursStart = pmWorkHours; } else if (startNow >= pmWorkStart && startNow <= pmWorkEnd) { if (endNow <= pmWorkEnd) minorHoursStart = endNow.Subtract(startNow).TotalHours; else minorHoursStart = pmWorkEnd.Subtract(startNow).TotalHours; } else minorHoursStart = 0; } } else//开始和结束不再同一天 { if (startNow < amWorkStart) minorHoursStart = workHours; else if (startNow >= amWorkStart && startNow <= amWorkEnd) minorHoursStart = amWorkEnd.Subtract(startNow).TotalHours + pmWorkHours; else if (startNow > amWorkEnd && startNow < pmWorkStart) minorHoursStart = pmWorkHours; else if (startNow >= pmWorkStart && startNow <= pmWorkEnd) minorHoursStart = pmWorkEnd.Subtract(startNow).TotalHours; if (IsOverTime)//考虑加班 { if (endNow < amWorkStart) minorHoursEnd = 0; else if (endNow >= amWorkStart && endNow <= amWorkEnd) minorHoursEnd = endNow.Subtract(amWorkStart).TotalHours; else if (endNow > amWorkEnd && endNow < pmWorkStart) minorHoursEnd = amWorkHours; else if (endNow >= pmWorkStart) minorHoursEnd = amWorkHours + endNow.Subtract(pmWorkStart).TotalHours; } else//不考虑加班 { if (endNow < amWorkStart) minorHoursEnd = 0; else if (endNow >= amWorkStart && endNow <= amWorkEnd) minorHoursEnd = endNow.Subtract(amWorkStart).TotalHours; else if (endNow > amWorkEnd && endNow < pmWorkStart) minorHoursEnd = amWorkHours; else if (endNow >= pmWorkStart && endNow <= pmWorkEnd) minorHoursEnd = amWorkHours + endNow.Subtract(pmWorkStart).TotalHours; else minorHoursEnd = workHours; } switch (StartTime.DayOfWeek)//判断开始当前是否休息 { case DayOfWeek.Sunday: if (IsSundayRest) minorHoursStart = 0; break; case DayOfWeek.Monday: if (IsMondayRest) minorHoursStart = 0; break; case DayOfWeek.Tuesday: if (IsTuesdayRest) minorHoursStart = 0; break; case DayOfWeek.Wednesday: if (IsWednesdayRest) minorHoursStart = 0; break; case DayOfWeek.Thursday: if (IsThursdayRest) minorHoursStart = 0; break; case DayOfWeek.Friday: if (IsFridayRest) minorHoursStart = 0; break; case DayOfWeek.Saturday: if (IsSaturdayRest) minorHoursStart = 0; break; default: break; } if (diffDays - 1 > 0) { for (int i = 1; i < diffDays; i++) { switch (StartTime.AddDays(i).DayOfWeek) { case DayOfWeek.Sunday: if (!IsSundayRest) manyHours += workHours; break; case DayOfWeek.Monday: if (!IsMondayRest) manyHours += workHours; break; case DayOfWeek.Tuesday: if (!IsTuesdayRest) manyHours += workHours; break; case DayOfWeek.Wednesday: if (!IsWednesdayRest) manyHours += workHours; break; case DayOfWeek.Thursday: if (!IsThursdayRest) manyHours += workHours; break; case DayOfWeek.Friday: if (!IsFridayRest) manyHours += workHours; break; case DayOfWeek.Saturday: if (!IsSaturdayRest) manyHours += workHours; break; default: break; } } } } return minorHoursStart + minorHoursEnd + manyHours; } } }