计算日期范围内的工作日数

时间:2011-01-05 00:13:37

标签: php

我正在尝试使用PHP计算给定日期范围内的工作日数(monda-friday)。如果用户输入开始日期(2010-12-01)和结束日期(2010-12-24),则该函数应吐出该日期范围内的工作日天数。

这是我发现的,但它没有帮助..

function getworkingdays_time($STARTSTAMP, $ENDSTAMP){

  $noofdays = ceil(($ENDSTAMP - $STARTSTAMP) / 86400);
    $sundaycounter = 0;
    $saturdaycounter = 0;
    $holidaycounter = 0;
    $offset = 0;
    $holidaycounter = check_holiday_range($STARTSTAMP, $ENDSTAMP);        // check holiday range


if(!defined("WORKSATURDAYS"))
{
    define("WORKSATURDAYS", 0);
}
if(!defined("WORKSUNDAYS"))
{
    define("WORKSUNDAYS", 0);
}  


    for ($i = 0; $i <= $noofdays; $i++){
        $ts = $STARTSTAMP + ($i * 86400);
        if (WORKSATURDAYS == '0' && date("l", $ts) == "Saturday"){
            ## they dont work saturdays
            $saturdaycounter ++;
        } elseif (WORKSUNDAYS == '0' && date("l", $ts) == "Sunday"){
            ## they dont work sundays
            $sundaycounter ++;
        }        
    }
    $total = $holidaycounter + $saturdaycounter + $sundaycounter;
    $offset = $total;
    if ($total > 0){
        $total = getworkingdays_time($ENDSTAMP + 86400, ($ENDSTAMP + ($total * 86400) + 86400));
        $offset += $total;
    }
    unset($holidaycounter, $saturdaycounter, $sundaycounter, $i, $noofdays, $ts, $total);
    return ($offset);
}

任何帮助将不胜感激。 谢谢堆 的PSi

2 个答案:

答案 0 :(得分:2)

最简单的方法可能是将问题分成三部分。假设“周日”是周一到周五,那么:

  1. 计算从现在到该范围内的第一个星期一之间的工作日天数。如果开始日期是星期一,则此步骤提供0。
  2. 从结束日期到范围中的最后一个星期一向后计算 。如果结束日期是星期一,则此步骤提供0。
  3. 确定第一个星期一和上一个星期一之间的天数除以7,然后乘以5.
  4. 添加三个步骤的结果,您将获得给定日期范围内的总工作日数。

    对于假期,您最好计算范围内的假期数量并减去总数。

    如果您在星期六或星期日工作,那么在前两个步骤中调整计数,并在确定了整数周数后,使用5以外的数字作为被乘数。

答案 1 :(得分:0)

这是我想出的一种简单算法。对不起,它在Python中,但它可以适应我认为的其他语言。函数(start, end)的参数应该是时间元组。

def find_work_days(start,end):
    days = (end.tm_yday - start.tm_yday) + 1
    weeks = days / 7
    leftover = days % 7
    if start.tm_wday + leftover == 6:
        leftover -= 1
    elif start.tm_wday + leftover > 6:
        leftover -= 2
    if start.tm_wday == 6: leftover += 1

    work_days = weeks * 5 + leftover
    return work_days