计算一个月中的工作日数量

9

可能重复:
获取给定月份的工作日数

如何计算任何一个月的工作日?cal_days_in_month 只返回一个月中的总天数。我的任务是计算除了星期六和星期天或仅星期天以外的那个月中的天数。有没有找到这个的方法?


1
@keune:星期六或星期日只是一个例子。对于某些月份,我可能需要在没有星期一和星期四的情况下进行计算,对于另一些月份,则是没有星期三和星期四的情况。 - Sarvap Praharanayuthan
1
@SuryaS 上述提到的问题中被接受的答案也可以为您完成这个任务。 - Will Vousden
5个回答

16
function countDays($year, $month, $ignore) {
    $count = 0;
    $counter = mktime(0, 0, 0, $month, 1, $year);
    while (date("n", $counter) == $month) {
        if (in_array(date("w", $counter), $ignore) == false) {
            $count++;
        }
        $counter = strtotime("+1 day", $counter);
    }
    return $count;
}
echo countDays(2013, 1, array(0, 6)); // 23

在此示例中使用了date函数。关于忽略参数的说明:0表示星期日,...,6表示星期六。


13

获取给定月份工作日数量中复制第二个答案:

您不需要计算该月的每一天。您已经知道前28天包含20个工作日,无论如何。您只需要确定最后几天。将起始值更改为29。然后将20个工作日添加到返回值。

function get_weekdays($m,$y) {
$lastday = date("t",mktime(0,0,0,$m,1,$y));
$weekdays=0;
for($d=29;$d<=$lastday;$d++) {
    $wd = date("w",mktime(0,0,0,$m,$d,$y));
    if($wd > 0 && $wd < 6) $weekdays++;
    }
return $weekdays+20;
}

这应该能解决你的问题,而且确实是一种高效的解决方案。

4

一个简单(不太优雅)的答案是创建该月第一天的时间戳,使用date()获取月份的物理名称,然后使用switch或if来确定它是否是工作日。

$myTime = strtotime("1/1/2013");  // Use whatever date format you want
$daysInMonth = cal_days_in_month(CAL_GREGORIAN, 1, 2013); // 31
$workDays = 0;

while($daysInMonth > 0)
{
    $day = date("D", $myTime); // Sun - Sat
    if($day != "Sun" && $day != "Sat")
        $workDays++;

    $daysInMonth--;
    $myTime += 86400; // 86,400 seconds = 24 hrs.
}

echo "There are $workDays work days this month!";

输出

There are 23 work days this month!

http://php.net/manual/en/function.strtotime.php

http://php.net/manual/en/function.date.php


我可能会选择 $myTime=strtotime('+1 day', $myTime); 而不是仅仅添加 86,400 秒,因为我注意到在某些情况下,添加一天的秒数并不能始终产生一致的结果。 - Aaron Mason
我喜欢这个方法,它运行良好!+1 - Martin

1

直接在谷歌上搜索就好了,伙计。

为了后人,你的算法:

  • 使用date()获取月份中的天数。
  • 从第一天开始,使用mktime/gmmktime创建一个时期时间戳,然后使用date()确定它代表星期几。
  • 重复以上步骤,直到找到第一个工作日(星期一)。将其记为“i”。
  • 让当前总数为“t”,其初始值为(0)。
  • 让j = i。当j小于(i + 5)-并且-小于该月的最大天数时,增加t。每次增加(2)(跳过周末),并从此行的开头重复,直到“i”超过该月的最大天数。
  • 应用成功和幸福,并从头开始重复,直到工作日的总数为(0)。

0
function countDays($y, $m, $ignore = false) 
{
    $result = 0;
    $loop = strtotime("$y-$m-01");
    do if(!$ignore or !in_array(strftime("%u",$loop),$ignore))
        $result++;
    while(strftime("%m",$loop = strtotime("+1 day",$loop))==$m);
    return $result;
}
echo countDays(2013,1,array(6,7));//23
echo countDays(2013,2);//28

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接