计算工作日的一种思路

本文介绍了如何利用C#编程语言,结合System.DateTime类和System.TimeSpan类,实现计算两个日期之间工作日总数的逻辑。包括判断非工作日(周六、周日及指定公休日)的计算方法,并提供了示例代码,以及如何动态设置公休日。通过实例演示了函数的调用方式。
 因项目需要,要在.net中用c#实现计算两个时间段的工作日总数,计算逻辑如下,
两个日期之间的星期6,星期天算休息日,不算工作日,同时可以在后台设置多段时间为公休日,比如2005-10-1至2005-10-7号为公休日,公休的日期在后台通过数据库维护。(该计算逻辑可能不能百分百涵盖工作日,有可能会在星期6或星期天也上班,大家可以根据该逻辑引申,我先抛砖引玉)
   开始在网上想找相关资料,没有发现有相关内容,自己花了点时间研究了下System.DateTime类和System.TimeSpan 类,简单实现了该逻辑.System.DateTime类估计大家都应该比较熟悉,System.TimeSpan是表示一个时间间隔,俺以前没怎么用过,大家可以查查msdn.
    实现的函数如下:

 

ExpandedBlockStart.gifContractedBlock.gif/**//// <summary>
/// 计算两个日期之间的工作日数,(星期6,星期天,不算工作日)dt1和dt2之间相隔多少工作日,其中dt3-dt4的时间为公休日。
/// </summary>
/// <param name="dt1">要计算的起始时间</param>
/// <param name="dt2">要计算的结束时间</param>
/// <param name="dt3">公休起始时间</param>
/// <param name="dt4">公休结束时间</param>
/// <returns>intReturn</returns>

private int DifferDate(DateTime dt1,DateTime dt2,DateTime dt3,DateTime dt4)
ExpandedBlockStart.gifContractedBlock.gif
{
int intReturn=0;//返回值,即dt2和dt1之间的工作日数

System.TimeSpan tsDiffer
=dt2.Date-dt1.Date;//计算dt2和dt1之间相差多少天
int intDiffer=tsDiffer.Days;//相差天数的int值
for(int i=0;i<intDiffer;i++)//从dt1开始一天天加,判断临时的日期值是不是星期六或星期天,如果既不是星期六,也不是星期天,而且也不在dt3和dt4之间,则该天为工作日,intReturn加1
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
    DateTime dtTemp
=dt1.Date.AddDays(i);
    
if((dtTemp.DayOfWeek!=System.DayOfWeek.Sunday) && (dtTemp.DayOfWeek!=System.DayOfWeek.Saturday))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
if((dtTemp.Date<dt3.Date) || (dtTemp.Date>dt4.Date))
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            intReturn
++;
        }

    }

    
}

return intReturn;

}

调用示例如下(大家可以在数据库中设置dt3,dt4,来动态设置公休日):

private void Page_Load(object sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif
{
    DateTime dt1
=Convert.ToDateTime("2005-08-18");
    DateTime dt2
=Convert.ToDateTime("2005-08-31");
    DateTime dt3
=Convert.ToDateTime("2005-08-22");
    DateTime dt4
=Convert.ToDateTime("2005-08-24");
    
int intDisp=this.DifferDate(dt1,dt2,dt3,dt4);
    Response.Write(intDisp
+"<br>");
}

转载于:https://www.cnblogs.com/jhxk/articles/1945671.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值