c# 计算两日期的工作时间间隔(排除非工作日)及计算下一个工作时间点.
一个日期段如工作时间为 8:00 至 17:00
public class TimeHelper
{ /// <summary>
/// 计算时间间隔
/// </summary>
/// <param name="tsStart"></param>
/// <param name="tsEnd"></param>
/// <param name="time_start"></param>
/// <param name="time_end"></param>
/// <returns></returns>
public static TimeSpan GetTimeSpan(TimeSpan tsStart, TimeSpan tsEnd, TimeSpan time_start, TimeSpan time_end)
{
if (tsStart > tsEnd)
return new TimeSpan(); if (tsEnd < time_start)
return new TimeSpan(); if (tsStart > time_end)
return new TimeSpan(); if (tsStart >= time_start && tsStart <= time_end)
time_start = tsStart; if (tsEnd <= time_end && tsEnd >= time_start)
time_end = tsEnd; return time_end - time_start;
}
/// <summary>
/// 获取两日期的工作时间间隔
/// </summary>
/// <param name="dtStart"></param>
/// <param name="dtEnd"></param>
/// <param name="time_start"></param>
/// <param name="time_end"></param>
/// <returns></returns>
public static TimeSpan GetDateTimeSpan(DateTime dtStart, DateTime dtEnd, TimeSpan time_start, TimeSpan time_end)
{
if (dtStart.Date == dtEnd.Date) //如果是同一天
{
if (IsWorkDay(dtStart))
return GetTimeSpan(dtStart.TimeOfDay, dtEnd.TimeOfDay, time_start, time_end);
else
return new TimeSpan();
}
//如果不是同一天 计算天数减去1 乘以标准时长 加上分别计算开始开数和结束天数
double days = dtEnd.Date.Subtract(dtStart.Date).TotalDays - ; TimeSpan startTimeSpan;
if (IsWorkDay(dtStart))
startTimeSpan = GetTimeSpan(dtStart.TimeOfDay, new TimeSpan(, , ), time_start, time_end);//开始天
else
startTimeSpan = new TimeSpan(); TimeSpan endTimeSpan;
if (IsWorkDay(dtEnd))
endTimeSpan = GetTimeSpan(new TimeSpan(, , ), dtEnd.TimeOfDay, time_start, time_end);//结束天
else
endTimeSpan = new TimeSpan(); TimeSpan totalTimeSpan = startTimeSpan + endTimeSpan; //总值 TimeSpan preTimeSpan = time_end - time_start;
for (int i = ; i <=days; i++)
{
if (IsWorkDay(dtStart.AddDays(i)))
totalTimeSpan += preTimeSpan; //添加间隔天
} return totalTimeSpan;
}
/// <summary>
/// 判断是否为工作日
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static bool IsWorkDay(DateTime dt)
{
//先从日期表中,查找不是上班时间,如果不是直接返回 false ,如果是,直接返回 true。
//如果在日期表中,找不到,则查找定义的日历,依据日历定义的周末时间来定义是否为工作日。
//获取日历中不上班的标准周末时间,判断是不是上班时间
if (dt.DayOfWeek == DayOfWeek.Sunday || dt.DayOfWeek == DayOfWeek.Saturday)
return false;
else
return true;
}
/// <summary>
/// 给定时间点加上时间间隔后得出新的时间
/// </summary>
/// <param name="startDate"></param>
/// <param name="exTimeSpan"></param>
/// <param name="time_start"></param>
/// <param name="time_end"></param>
/// <returns></returns>
public static DateTime GetDateTime(DateTime startDate, TimeSpan exTimeSpan, TimeSpan time_start, TimeSpan time_end)
{
TimeSpan t_span = exTimeSpan;
//初始到工作日
while (!IsWorkDay(startDate))
startDate = startDate.AddDays();
//初始到起始时间
if (startDate.TimeOfDay < time_start)
startDate = startDate - startDate.TimeOfDay + time_start; if (startDate.TimeOfDay > time_end)
{
startDate = startDate.AddDays();
startDate = startDate - startDate.TimeOfDay + time_start; //初始到工作日
while (!IsWorkDay(startDate))
startDate = startDate.AddDays();
}
//计算本天结束剩余多少天
TimeSpan tmpTs = GetTimeSpan(startDate.TimeOfDay, time_end, time_start, time_end); //剩余时长
exTimeSpan = exTimeSpan - tmpTs;
//如果计算后剩余小于零 直接返回
if (exTimeSpan < new TimeSpan())
return startDate + t_span; //如果计算后大于零,继续新增1天.
TimeSpan preDayTimeSpan = time_end - time_start;
do
{
do
{
startDate = startDate.AddDays();
} while (!IsWorkDay(startDate)); if (exTimeSpan > preDayTimeSpan)
exTimeSpan -= preDayTimeSpan;
else
break; } while (exTimeSpan > new TimeSpan()); startDate = startDate - startDate.TimeOfDay + time_start; //把计算得出的当天值为初始时间如早上8:00 return startDate + exTimeSpan;
}
}
二段工作时间:如 8:00至12:00 13:00 至17:00
public class TimeHelper2
{
public static TimeSpan GetDateTimeSpan(DateTime dtStart, DateTime dtEnd, TimeSpan time_start, TimeSpan time_end, TimeSpan time_start2, TimeSpan time_end2)
{
if (dtStart.Date == dtEnd.Date) //如果是同一天
{
if (IsWorkDay(dtStart))
return GetTimeSpan(dtStart.TimeOfDay, dtEnd.TimeOfDay, time_start, time_end, time_start2, time_end2);
else
return new TimeSpan();
}
//如果不是同一天 计算天数减去1 乘以标准时长 加上分别计算开始开数和结束天数
double days = dtEnd.Date.Subtract(dtStart.Date).TotalDays - ; TimeSpan startTimeSpan;
if (IsWorkDay(dtStart))
startTimeSpan = GetTimeSpan(dtStart.TimeOfDay, new TimeSpan(, , ), time_start, time_end, time_start2, time_end2);//开始天
else
startTimeSpan = new TimeSpan(); TimeSpan endTimeSpan;
if (IsWorkDay(dtEnd))
endTimeSpan = GetTimeSpan(new TimeSpan(, , ), dtEnd.TimeOfDay, time_start, time_end, time_start2, time_end2);//结束天
else
endTimeSpan = new TimeSpan(); TimeSpan totalTimeSpan = startTimeSpan + endTimeSpan; //总值 TimeSpan preTimeSpan = GetTimeSpan(new TimeSpan(, , ), new TimeSpan(, , ), time_start, time_end, time_start2, time_end2);//开始天
for (int i = ; i <= days; i++)
{
if (IsWorkDay(dtStart.AddDays(i)))
totalTimeSpan += preTimeSpan; //添加间隔天
} return totalTimeSpan;
} /// <summary>
/// 判断是否为工作日
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static bool IsWorkDay(DateTime dt)
{
//先从日期表中,查找不是上班时间,如果不是直接返回 false ,如果是,直接返回 true。
//如果在日期表中,找不到,则查找定义的日历,依据日历定义的周末时间来定义是否为工作日。
//获取日历中不上班的标准周末时间,判断是不是上班时间
if (dt.DayOfWeek == DayOfWeek.Sunday || dt.DayOfWeek == DayOfWeek.Saturday)
return false;
else
return true;
} //同一天获取
public static TimeSpan GetTimeSpan(TimeSpan tsStart, TimeSpan tsEnd, TimeSpan time_start, TimeSpan time_end, TimeSpan time_start2, TimeSpan time_end2)
{ //判断 开始时间
if (tsStart < time_start)
{
//标准开始时间不变
//start1 不变
//start2 不变
}
else if (tsStart >= time_start && tsStart <= time_end)
{
//标准开始= dtStart
time_start = tsStart;
//start1 变
//start2 不变
}
else if (tsStart > time_end && tsStart < time_start2)
{
time_start = time_end;
//start1 变
//start2 不变
}
else if (tsStart >= time_start2 && tsStart <= time_end2)
{
time_start = time_end;
time_start2 = tsStart;
//start1 变
//start2 变
}
else if (tsStart > time_end2)
{
time_start = time_end;
time_start2 = time_end2;
//start1 变
//start2 变
} //判断 结束时间
if (tsEnd < time_start)
{
//标准开始时间不变
time_end = time_start;
time_end2 = time_start2;
//time_end 变
//time_end2变
}
else if (tsEnd >= time_start && tsEnd <= time_end)
{
time_end = tsEnd;
time_end2 = time_start2;
//time_end 变
//time_end2变
}
else if (tsEnd > time_end && tsEnd < time_start2)
{
time_end2 = time_start2;
//time_end2 不变
//time_end1变
}
else if (tsEnd >= time_start2 && tsEnd <= time_end2)
{
time_end2 = tsEnd;
//time_end 不变
//time_end2变
}
else if (tsEnd > time_end2)
{
//time_end 不变
//time_end2不变
} return (time_end - time_start) + (time_end2 - time_start2);
}
}
三个时间段的 如工作时间为://8:30-12:00 13.30-17.30 18.00-21.00
public class TimeHelper3
{ public static TimeSpan GetDateTimeSpan(DateTime dtStart, DateTime dtEnd, TimeSpan time_start, TimeSpan time_end, TimeSpan time_start2, TimeSpan time_end2, TimeSpan time_start3, TimeSpan time_end3)
{
if (dtStart.Date == dtEnd.Date) //如果是同一天
{
if (IsWorkDay(dtStart))
return GetTimeSpan(dtStart.TimeOfDay, dtEnd.TimeOfDay, time_start, time_end, time_start2, time_end2, time_start3, time_end3);
else
return new TimeSpan();
}
//如果不是同一天 计算天数减去1 乘以标准时长 加上分别计算开始开数和结束天数
double days = dtEnd.Date.Subtract(dtStart.Date).TotalDays - ; TimeSpan startTimeSpan;
if (IsWorkDay(dtStart))
startTimeSpan = GetTimeSpan(dtStart.TimeOfDay, new TimeSpan(, , ), time_start, time_end, time_start2, time_end2, time_start3, time_end3);//开始天
else
startTimeSpan = new TimeSpan(); TimeSpan endTimeSpan;
if (IsWorkDay(dtEnd))
endTimeSpan = GetTimeSpan(new TimeSpan(, , ), dtEnd.TimeOfDay, time_start, time_end, time_start2, time_end2, time_start3, time_end3);//结束天
else
endTimeSpan = new TimeSpan(); TimeSpan totalTimeSpan = startTimeSpan + endTimeSpan; //总值 TimeSpan preTimeSpan = GetTimeSpan(new TimeSpan(, , ), new TimeSpan(, , ), time_start, time_end, time_start2, time_end2, time_start3, time_end3);//开始天
for (int i = ; i <= days; i++)
{
if (IsWorkDay(dtStart.AddDays(i)))
totalTimeSpan += preTimeSpan; //添加间隔天
} return totalTimeSpan;
} /// <summary>
/// 判断是否为工作日
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static bool IsWorkDay(DateTime dt)
{
//先从日期表中,查找不是上班时间,如果不是直接返回 false ,如果是,直接返回 true。
//如果在日期表中,找不到,则查找定义的日历,依据日历定义的周末时间来定义是否为工作日。
//获取日历中不上班的标准周末时间,判断是不是上班时间
if (dt.DayOfWeek == DayOfWeek.Sunday || dt.DayOfWeek == DayOfWeek.Saturday)
return false;
else
return true;
}
//同一天获取
public static TimeSpan GetTimeSpan(TimeSpan tsStart, TimeSpan tsEnd, TimeSpan time_start, TimeSpan time_end, TimeSpan time_start2, TimeSpan time_end2, TimeSpan time_start3, TimeSpan time_end3)
{
//判断 开始时间
if (tsStart < time_start)
{
//标准开始时间不变
//start1 不变
//start2 不变
//start3 不变
}
else if (tsStart >= time_start && tsStart <= time_end)
{
//标准开始= dtStart
time_start = tsStart;
//start1 变
//start2 不变
//start3 不变
}
else if (tsStart > time_end && tsStart < time_start2)
{
time_start = time_end;
//start1 变
//start2 不变
//start3 不变
}
else if (tsStart >= time_start2 && tsStart <= time_end2)
{
time_start = time_end;
time_start2 = tsStart;
//start1 变
//start2 变
//start3 不变
}
else if (tsStart > time_end2 && tsStart < time_start3)
{
time_start = time_end;
time_start2 = time_end2;
//start1 变
//start2 变
//start3 不变
}
else if (tsStart >= time_start3 && tsStart <= time_end3)
{
time_start = time_end;
time_start2 = time_end2;
time_start3 = tsStart;
//start1 变
//start2 变
//start3 变
}
else if (tsStart > time_end3)
{
time_start = time_end;
time_start2 = time_end2;
time_start3 = time_end3;
} //判断 结束时间
if (tsEnd < time_start)
{
//标准开始时间不变
time_end = time_start;
time_end2 = time_start2;
time_end3 = time_start3;
//time_end 变
//time_end2变
//time_end3变
}
else if (tsEnd >= time_start && tsEnd <= time_end)
{
time_end = tsEnd;
time_end2 = time_start2;
time_end3 = time_start3;
//time_end 变
//time_end2变
//time_end3变
}
else if (tsEnd > time_end && tsEnd < time_start2)
{
time_end2 = time_start2;
time_end3 = time_start3;
//time_end1 不变
//time_end2变
//time_end3变
}
else if (tsEnd >= time_start2 && tsEnd <= time_end2)
{
time_end2 = tsEnd;
time_end3 = time_start3;
//time_end 不变
//time_end2变
//time_end3变
}
else if (tsEnd > time_end2 && tsEnd < time_start3)
{
time_end3 = time_start3;
//time_end 不变
//time_end2不变
//time_end3变
}
else if (tsEnd >= time_start3 && tsEnd <= time_end3)
{
time_end3 = tsEnd;
//time_end 不变
//time_end2不变
//time_end3变
}
else if (tsEnd > time_end3)
{
//time_end 不变
//time_end2不变
//time_end3不变
} return (time_end - time_start) + (time_end2 - time_start2) + (time_end3 - time_start3);
}
}
使用方法:
static void Main(string[] args)
{
DateTime dt = Convert.ToDateTime("2014-04-17 08:00");
DateTime dt2 = Convert.ToDateTime("2014-04-21 08:00"); TimeSpan tsStar1 = new TimeSpan(, , );
TimeSpan tsEnd1 = new TimeSpan(, , ); TimeSpan tsStar2 = new TimeSpan(, , );
TimeSpan tsEnd2 = new TimeSpan(, , ); TimeSpan tsStar3 = new TimeSpan(, , );
TimeSpan tsEnd3 = new TimeSpan(, , ); //8:30-12:00 13.30-17.30 18.00-21.00 TimeSpan ts1 = TimeHelper.GetDateTimeSpan(dt, dt2, tsStar1, tsEnd1); TimeSpan ts2 = TimeHelper2.GetDateTimeSpan(dt, dt2, tsStar1, tsEnd1, tsStar2, tsEnd2); TimeSpan ts3 = TimeHelper3.GetDateTimeSpan(dt, dt2, tsStar1, tsEnd1, tsStar2, tsEnd2, tsStar3, tsEnd3); Console.WriteLine("一阶段:{0}天 {1}小时,{2}分,{3}秒", ts1.Days, ts1.Hours, ts1.Minutes, ts1.Seconds);
Console.WriteLine("两阶段:{0}天 {1}小时,{2}分,{3}秒", ts2.Days, ts2.Hours, ts2.Minutes, ts2.Seconds);
Console.WriteLine("三阶段:{0}天 {1}小时,{2}分,{3}秒", ts3.Days, ts3.Hours, ts3.Minutes, ts3.Seconds); Console.ReadLine(); }
c# 计算两日期的工作时间间隔(排除非工作日)及计算下一个工作时间点.的更多相关文章
- MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数
MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数 计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数,这里主要分享的是通过MySql内置的函数 TimeStampDiff() ...
- java:通过Calendar类正确计算两日期之间的间隔
在开发Android应用时偶然需要用到一个提示用户已用天数的功能,从实现上来看无非就是持久化存入用户第一次使用应用的时间firstTime(通过SharedPreferences .xml.sqlit ...
- C#计算两个时间年份月份天数(根据生日计算年龄)差,求时间间隔
C#计算两个时间年份月份差 DateTime dt1 = Convert.ToDateTime("2008-8-8"); DateTime dt2 = System.DateTim ...
- JS实现——计算两日期之差
在网上找了个js实现的,根据相差天数计算日期和根据两个日期计算相差多少天的示例和代码: 根据相差天数计算日期: 距离: 年 月 日 相差: 天 (输入负数则往前计算) 日期是: 根据日期计算相差天 ...
- oracle计算两日期相差多少秒,分钟,小时,天,周,月,年
--计算两个时间差相差多少秒select ceil((sysdate-t.transdate)* 24 * 60 * 60),t.transdate,sysdate from esc_trans_lo ...
- iOS 时间戳和时间互换,计算两日期相隔天数
/* *获取当前系统时间的时间戳 */ +(NSInteger)getNowTimestamp; /** * 获取当前时间 */ + (NSString *)getNowTimeTampF ...
- C++练习 | 计算两日期之间天数差
#include<iostream> #include<string> #include<cstring> using namespace std; class D ...
- mysql计算两个日期之间的天数
MYSQL自带函数计算给定的两个日期的间隔天数 有两个途径可获得 1.利用TO_DAYS函数 select to_days(now()) - to_days('20120512') 2 ...
- java计算两个日期之间的天数,排除节假日和周末
如题所说,计算两个日期之前的天数,排除节假日和周末.这里天数的类型为double,因为该功能实现的是请假天数的计算,有请一上午假的为0.5天. 不够很坑的是每个日期都要查询数据库,感觉很浪费时间. 原 ...
随机推荐
- PV3D学习笔记-导入DAE模型
网上关于PV3D导入DAE模型的例子都非常多,可惜我研究了半天,一个都没成功,或者是破面问题,或者是贴图不显示,再或者贴图乱掉了.今天晚上终于搞定,心得发上来. 制作模型的软件是SketchUp ...
- jquery获取显示器,屏幕的宽度,和高度
Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...
- SCP和SFTP(转)
原文:http://www.cnblogs.com/wang_yb/p/3819441.html 不管SCP还是SFTP,都是SSH的功能之一.都是使用SSH协议来传输文件的. 不用说文件内容,就是登 ...
- Unix 环境高级编程---线程创建、同步、
一下代码主要实现了linux下线程创建的基本方法,这些都是使用默认属性的.以后有机会再探讨自定义属性的情况.主要是为了练习三种基本的线程同步方法:互斥.读写锁以及条件变量. #include < ...
- Java环境搭建及语言基础
JRE和JDK JRE:Java Runtime Environment,java运行环境. JDK:Java Development Kit,java开发工具包. 使用JDK开发java程序,交给J ...
- 【Linux笔记】Linux目录结构
[Linux笔记]Linux目录结构 本文内容整理自网络,以作参考. /:根目录,位于linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib ...
- JQuery中attr ,html,text,val,的一些用法
attr:主要获取元素内部的属性,返回 的是属性值 html:返回当前元素(不包括他自己本身的标签,但是可以返回他自己的)的标签加上内容.仅限于返回第一个. text:和 .html() 方法不同, ...
- ImageSwitcher的应用
在android的开发中很多时候都会用到图片的切换,我相信大家在安装完apk后,都会遇到弹出用户向导,介绍本版本apk的新功能,如果你用的是平板电脑或手机的话,可以左右滑动以切换视图,如果你用的是an ...
- 异常:exception和error的区别
Throwable 是所有 Java 程序中错误处理的父类 ,有两种子类: Error 和 Exception . Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM ...
- 通过点击取消按钮关闭dialog窗口