Php 计算日期范围内的周天数

Php 计算日期范围内的周天数,php,Php,我试图使用PHP计算给定日期范围内的周天数(星期一星期五)。如果用户输入开始日期(2010-12-01)和结束日期(2010-12-24),则函数应显示该日期范围内的周天数 这是我发现的,但没用 function getworkingdays_time($STARTSTAMP, $ENDSTAMP){ $noofdays = ceil(($ENDSTAMP - $STARTSTAMP) / 86400); $sundaycounter = 0; $saturdaycount

我试图使用PHP计算给定日期范围内的周天数(星期一星期五)。如果用户输入开始日期(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);
}
函数getworkingdays\u time($STARTSTAMP,$ENDSTAMP){
$noofdays=ceil($ENDSTAMP-$STARTSTAMP)/86400);
$sundaycounter=0;
$saturdaycounter=0;
$holidaycounter=0;
$offset=0;
$holidaycounter=检查假日范围($STARTSTAMP,$ENDSTAMP);//检查假日范围
如果(!已定义(“工作日”))
{
定义(“工作自然日”,0);
}
如果(!已定义(“工作平台”))
{
定义(“工作平台”,0);
}  
对于($i=0;$i 0){
$total=getworkingdays_time($ENDSTAMP+86400,($ENDSTAMP+($total*86400)+86400));
$offset+=$total;
}
未设置($holidaycounter、$saturdaycounter、$sundaycounter、$i、$noofdays、$ts、$total);
回报(抵销);
}
任何帮助都将不胜感激。 谢谢你
PSi

最简单的方法可能是将问题分为三部分。假设“周日”为周一至周五,则:

  • 计算从现在到范围内的第一个星期一之间的周天数。如果开始日期是星期一,则此步骤提供0
  • 从结束日期到范围内的最后一个星期一倒数。如果结束日期是星期一,则此步骤提供0
  • 确定第一个星期一和最后一个星期一之间的天数,除以7,再乘以5
  • 将这三个步骤的结果相加,就可以得到给定日期范围内的总周天数

    对于假期,最好计算范围内的假期数,然后从总数中减去


    如果你在周六或周日工作,那么在前两个步骤中调整计数,并在确定该范围内的完整周数后,对被乘数使用5以外的数字。

    这是我提出的一个过于简单的算法。抱歉,它是用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
    
    见此帖: