【问题标题】:calculate number of week days in a date range计算日期范围内的周天数
【发布时间】:2011-01-05 00:13:36
【问题描述】:

我正在尝试使用 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);
}

任何帮助将不胜感激。 非常感谢 PSi

【问题讨论】:

标签: php


【解决方案1】:

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

  1. 计算从现在到该范围内的第一个星期一之间的周天数。如果开始日期是星期一,则此步骤提供 0。
  2. 倒数从结束日期到范围内的最后一个星期一。如果结束日期是星期一,则此步骤提供 0。
  3. 确定第一个星期一和最后一个星期一之间的天数,除以 7,再乘以 5。

将这三个步骤的结果相加,您就得到了给定日期范围内的工作日总数。

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

如果您在周六或周日工作,则在前两个步骤中调整计数,并在确定该范围内有多少整周后使用 5 以外的数字作为被乘数。

【讨论】:

    【解决方案2】:

    这是我想出的一个简单的算法。抱歉,它是用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2021-02-03
      相关资源
      最近更新 更多