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;//是否考虑加班
|
|
|
|
/// <summary>
|
/// 上午工作开始时间
|
/// </summary>
|
public string AmWorkStartTime { get { return _amWorkStartTime; } set { _amWorkStartTime = value; } }
|
|
/// <summary>
|
/// 上午工作结束时间
|
/// </summary>
|
public string AmWorkEndTime { get { return _amWorkEndTime; } set { _amWorkEndTime = value; } }
|
|
/// <summary>
|
/// 下午工作开始时间
|
/// </summary>
|
public string PmWorkStartTime { get { return _pmWorkStartTime; } set { _pmWorkStartTime = value; } }
|
|
/// <summary>
|
/// 下午工作结束时间
|
/// </summary>
|
public string PmWorkEndTime { get { return _pmWorkEndTime; } set { _pmWorkEndTime = value; } }
|
|
/// <summary>
|
/// 周日是否休息
|
/// </summary>
|
public bool IsSundayRest { get { return _isSundayRest; } set { _isSundayRest = value; } }
|
/// <summary>
|
/// 周一是否休息
|
/// </summary>
|
public bool IsMondayRest { get { return _isMondayRest; } set { _isMondayRest = value; } }
|
/// <summary>
|
/// 周二是否休息
|
/// </summary>
|
public bool IsTuesdayRest { get { return _isTuesdayRest; } set { _isTuesdayRest = value; } }
|
/// <summary>
|
/// 周三是否休息
|
/// </summary>
|
public bool IsWednesdayRest { get { return _isWednesdayRest; } set { _isWednesdayRest = value; } }
|
/// <summary>
|
/// 周四是否休息
|
/// </summary>
|
public bool IsThursdayRest { get { return _isThursdayRest; } set { _isThursdayRest = value; } }
|
/// <summary>
|
/// 周五是否休息
|
/// </summary>
|
public bool IsFridayRest { get { return _isFridayRest; } set { _isFridayRest = value; } }
|
/// <summary>
|
/// 周六是否休息
|
/// </summary>
|
public bool IsSaturdayRest { get { return _isSaturdayRest; } set { _isSaturdayRest = value; } }
|
/// <summary>
|
/// 是否考虑加班
|
/// </summary>
|
public bool IsOverTime { get { return _isOverTime; } set { _isOverTime = value; } }
|
|
/// <summary>
|
/// 计算一共经过了多少时间
|
/// </summary>
|
/// <param name="StartTime"></param>
|
/// <returns></returns>
|
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);
|
}
|
|
/// <summary>
|
/// 计算超过的时间
|
/// </summary>
|
/// <param name="StartTime"></param>
|
/// <returns></returns>
|
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);
|
}
|
|
|
/// <summary>
|
/// 计算指定时间段内的工作时间--以小时计
|
/// </summary>
|
/// <returns></returns>
|
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;
|
|
|
|
}
|
|
|
|
|
|
}
|
}
|