我怎样才能算出一个月的工作日数?

时间:2011-02-10 21:55:09

标签: date php4

我现在遇到这个问题:考虑到一个月和一年,我需要知道它有多少个工作日(即不包括星期六和星期日的天数)。

看起来很简单,但我很困惑。当然我可以用一个for循环解决它并检查当天是星期六还是星期天,如果没有增加一个计数器,但这只是简单的愚蠢(和线性时间)考虑到我很确定我可以通过几个部门或模块来逃避。

算法的任何想法?您可以随心所欲地使用PHP 4.4.1的所有功能。


编辑这是一个有效的for循环实现:

function weekdays_in_month($month, $year)
{
    $days_in_month = days_in_month($month); // days_in_month defined somewhere
    $first_day = date('w', mktime(0,0,0, $month, 1, $year));
    $counter = 0;
    for ($i = 0; $i < $days_in_month; $i++)
    {
        if (($first_day + $i + 1) % 7 >= 2)
            $counter++;
    }
    return $counter;
}

3 个答案:

答案 0 :(得分:3)

只需查看29日,30日和31日的工作日(如果存在这些日期)。

添加20。

编辑你的功能:

function weekdays_in_month($month, $year)
{
    // NOTE: days_in_month needs $year as input also, to account for leap years
    $days_in_month = days_in_month($month, $year); // days_in_month defined somewhere
    $first_day = date('w', mktime(0,0,0, $month, 1, $year));
    $counter = 20;  // first 28 days of month always have 20 weekdays
    for ($i = 28; $i < $days_in_month; $i++)
    {
        if (($first_day + $i + 1) % 7 >= 2)
            $counter++;
    }
    return $counter;
}

答案 1 :(得分:0)

你可以搜索一年中的第一个和最后一个星期日,然后将这两个日期的天数除以7。在星期六做同样的事情,然后你可以从总数中减去星期日和星期六的数量一年中的天数。这是迄今为止我发现的最有效的解决方案。

答案 2 :(得分:0)

发现此解决方案没有for循环(未经测试http://www.phpbuilder.com/board/archive/index.php/t-10267313.html

function weekdays_in_month($month, $year)
{
$first = mktime(0,0,1,$month,1,$year);
// The first day of the month is also the first day of the
// remaining days after whole weeks are handled.
list($first_day,$days) = explode(' ',date('w t',$first));
$weeks = floor($days/7);
$weekdays = $weeks*5;
$remaining_days = $days-$weeks*7;

if($remaining_days==0)
return $weekdays; // Only happens most Februarys

$weekdays += $remaining_days-1;
// Neither starts on Sunday nor ends on Saturday
if($first_day!=0 && ($first_day+$days-1)%7!=6)
{ // Adjust for weekend days.
$weekdays += ($remaining_days<=(6-$first_day))-
($remaining_days>(6-$first_day));
}


return $weekdays;
}