整理下根据开始、结束时间获取工作日天数及根据开始时间、工作日天数获取截止日期两个方法。
包含节假日补班及调休信息,节假日表可同步接口或自行编辑。
/// <summary>
/// 根据时间获取有多少工作日
/// </summary>
/// <param name="StartTime">开始时间</param>
/// <param name="EndTime">结束时间</param>
/// <returns></returns>
public string GetWorkNum(string StartTime, string EndTime)
{
DateTime start = Convert.ToDateTime(StartTime);
DateTime end = Convert.ToDateTime(EndTime);
int num = 0; //用于记录工作日天数
TimeSpan span = end - start;
//int totleDay=span.Days;
//DateTime spanNu = DateTime.Now.Subtract(span);
int AllDays = Convert.ToInt32(span.TotalDays) + 1;//差距的所有天数
int totleWeek = AllDays / 7;//差别多少周
int yuDay = AllDays % 7; //除了整个星期的天数
int lastDay = 0;
if (yuDay == 0) //正好整个周
{
lastDay = AllDays - (totleWeek * 2);
}
else
{
int weekDay = 0;
int endWeekDay = 0; //多余的天数有几天是周六或者周日
switch (start.DayOfWeek)
{
case DayOfWeek.Monday:
weekDay = 1;
break;
case DayOfWeek.Tuesday:
weekDay = 2;
break;
case DayOfWeek.Wednesday:
weekDay = 3;
break;
case DayOfWeek.Thursday:
weekDay = 4;
break;
case DayOfWeek.Friday:
weekDay = 5;
break;
case DayOfWeek.Saturday:
weekDay = 6;
break;
case DayOfWeek.Sunday:
weekDay = 7;
break;
}
if ((weekDay == 6 && yuDay >= 2) || (weekDay == 7 && yuDay >= 1) || (weekDay == 5 && yuDay >= 3) || (weekDay == 4 && yuDay >= 4) || (weekDay == 3 && yuDay >= 5) || (weekDay == 2 && yuDay >= 6) || (weekDay == 1 && yuDay >= 7))
{
endWeekDay = 2;
}
if ((weekDay == 6 && yuDay < 1) || (weekDay == 7 && yuDay < 5) || (weekDay == 5 && yuDay < 2) || (weekDay == 4 && yuDay < 3) || (weekDay == 3 && yuDay < 4) || (weekDay == 2 && yuDay < 5) || (weekDay == 1 && yuDay < 6))
{
endWeekDay = 1;
}
lastDay = AllDays - (totleWeek * 2) - endWeekDay;
}
num = lastDay;
//查询数据库获取补班及放假信息
string con = ConfigPara.EFDBConnection;
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("\"[^\"]*\"");
con = regex.Match(con).Value.Replace("\"", "");
string where = "where [Date] >='" + StartTime + "' and [Date] < '" + EndTime + "' ";
DataTable data = ExecuteDataTable(@"SELECT [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
+ where + @" ", con);
//循环获取数据库假期数据,根据sType字段(true,false)判断。 如果遇周末补班加+天,遇工作日休息-1天
for (int i = 0; i < data.Rows.Count; i++)
{
//判断该日期是否为补班 (False)
if (data.Rows[i]["sType"].ToString() == "false")
{
//判断如果日期是周六或者周末
if (Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Sunday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Saturday)
{
num++;
}
}
else
{
if (Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Monday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Tuesday
|| Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Wednesday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Thursday
|| Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Friday)
{
num--;
}
}
}
return num.ToString();
}
/// <summary>
/// 根据开始时间、工作日 获取截止日期。
/// </summary>
/// <param name="StartTime">开始时间</param>
/// <param name="num">工作日天数</param>
/// <returns></returns>
public string GetDate(string StartTime, int WorkNum)
{
DateTime start = Convert.ToDateTime(StartTime);
DateTime endTime = Convert.ToDateTime(StartTime).AddDays(+WorkNum); //结束时间暂且设置为开始时间+工作日天数
int dayNum = WorkNum;//声明天数
for (int i = 0; i < dayNum; i++)
{
//开始日期递增,判断是否为周末
if (Convert.ToDateTime(start.AddDays(+i)).DayOfWeek == DayOfWeek.Sunday || Convert.ToDateTime(start.AddDays(+i)).DayOfWeek == DayOfWeek.Saturday)
{
//如果是,自然日天数+1
dayNum++;
}
}
//循环结束后,得到除掉周末的开始日期至截止日期天数dayNum。
DateTime EndTime = Convert.ToDateTime(StartTime).AddDays(+dayNum);
//查询数据库获取补班及放假信息
string con = ConfigPara.EFDBConnection;
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("\"[^\"]*\"");
con = regex.Match(con).Value.Replace("\"", "");
string where = "where [Date] >='" + StartTime + "' and [Date] < '" + EndTime + "' ";
//获取时间段内调休、补班信息
DataTable data = ExecuteDataTable(@"SELECT [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
+ where + @" ", con);
int tx = 0;
int bb = 0;
//循环获取数据库假期数据,根据sType字段(true,false)判断。 如果遇周末补班加+天,遇工作日休息-1天
//循环过程中如有周末补班或工作日放假,则对天数进行调整,调整过程中查询数据库获取调整时的日期,判断是否为补班或放假,再次进行天数调整。
//数据量不大,写法为直接获取数据库数据,如遇性能问题,可将本方法内读取数据库的方式调整为集合。
for (int i = 0; i < data.Rows.Count; i++)
{
//判断该日期是否为补班 (False)
if (data.Rows[i]["sType"].ToString() == "false")
{
//判断如果日期是周六或者周末
if (Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Sunday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Saturday)
{
bb++;//周末上班
}
}
else
{
if (Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Monday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Tuesday
|| Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Wednesday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Thursday
|| Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Friday)
{
tx++;//工作日休息
}
}
}
if (tx > 0) //如果工作日休息天数>0
{
for (int i = 1; i <= tx; i++)
{
//自然日递增,判断如果为周末,再次递增
if (EndTime.AddDays(+i).DayOfWeek == DayOfWeek.Sunday || EndTime.AddDays(+i).DayOfWeek == DayOfWeek.Saturday)
{
data = ExecuteDataTable(@"SELECT [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
+ @" where Date ='" + EndTime.AddDays(+i) + "' and sType='false' ", con);
//如果这天为补班,则延后天数不增加。否则延后天数增加+1
if (data.Rows.Count > 0)
{
}
else
{
tx++;
}
}
else
{
//如果为工作日
data = ExecuteDataTable(@"SELECT [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
+ @" where Date ='" + EndTime.AddDays(+i) + "' and sType='true' ", con);
//判断当天是否放假,如果放假,延后天数+1
if (data.Rows.Count > 0)
{
tx++;
}
}
}
EndTime = EndTime.AddDays(+tx);
}
if (bb > 0)
{
for (int i = 1; i <= bb; i++)
{
//判断如果为周末,再次递减
if (EndTime.AddDays(-i).DayOfWeek == DayOfWeek.Sunday || EndTime.AddDays(-i).DayOfWeek == DayOfWeek.Saturday)
{
data = ExecuteDataTable(@"SELECT [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
+ @" where Date ='" + EndTime.AddDays(-i) + "' and sType='false' ", con);
//bb为补班天数 用于总天数减掉,递减过程中,如果遇到周末补班,则不再多减总天数。
if (data.Rows.Count > 0)
{
}
else
{
bb++;
}
}
}
EndTime = EndTime.AddDays(-bb);
}
return EndTime.ToString();
}
数据库表结构如下:
year:年份
Date:日期
wage:星期
sType:值为true or false,放假为true,补班为false