计算一个月的工作日数

时间:2013-01-06 19:41:23

标签: php date datetime

  

可能重复:
  Get number of weekdays in a given month

如何计算任何月份的工作日? cal_days_in_month只返回一个月内的总天数。我的任务是计算除星期六,星期日或星期日外的每月天数。找到这个的任何方法?

5 个答案:

答案 0 :(得分:13)

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是星期六。

答案 1 :(得分:12)

复制第二个答案:Get number of weekdays in a given month

  

您无需计算每月的每一天。你已经知道了   无论如何,前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;
}

这应该可以解决您的问题,确实是一种有效的解决方案。

答案 2 :(得分:3)

一个简单(不那么优雅)的答案就是创建一个月中第一天的时间戳,使用date()来获取月份的物理名称,然后切换或确定它是否为a平日与否。

$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

答案 3 :(得分:1)

只需进行谷歌搜索,伙计。

对于后代,您的算法:

  • 使用date()获取当月的天数。
  • 从第(1)日开始,使用mktime / gmmktime创建一个纪元时间戳,然后使用 date()用于确定它代表的星期几。
  • 重复,直到找到第一个工作日(星期一)。让这是“我”。
  • 让当前计数为“t”,其初始值为(0)。
  • 设j = i。其中j小于(i + 5) - 并且小于那里的最大天数 月,增量t。增加(2)(跳过周末的日子)并重复 此行的开头直到“i”超过了当月的最大天数。
  • 申请成功和幸福,并从开始到总工作日重复 是(0)。

答案 4 :(得分: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