Php 计算一个月的工作天数

Php 计算一个月的工作天数,php,date,datetime,Php,Date,Datetime,可能重复: 如何计算任何月份的工作日cal\u days\u in\u month仅返回一个月的总天数。我的任务是计算一个月的天数,除了星期六和星期天或单独的星期天。找到这个问题的任何方法?一个简单(不那么优雅)的答案就是创建一个月份第一天的时间戳,使用date()获取月份的物理名称,然后切换或确定它是否是工作日 $myTime = strtotime("1/1/2013"); // Use whatever date format you want $daysInMonth = cal_d

可能重复:

如何计算任何月份的工作日
cal\u days\u in\u month
仅返回一个月的总天数。我的任务是计算一个月的天数,除了星期六和星期天或单独的星期天。找到这个问题的任何方法?

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

$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!


从以下位置复制第二个答案:

你不需要一个月里每天都数数。你已经知道答案了 前28天包含20个工作日,无论发生什么情况。你所要做的就是 是最后几天。将“开始”值更改为29。然后加上 20个工作日返回值

函数get_平日($m,$y){
$lastday=日期(“t”,mktime(0,0,0,$m,1,$y));
$weekdays=0;
对于($d=29;$d0&$wd<6)$weekdays++;
}
返回$weekdays+20;
}
这应该可以解决您的问题,而且确实是一个有效的解决方案

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

本例中使用了该函数。请注意忽略参数:0是星期天,…,6是星期六。

只需在谷歌上搜索一下,伙计

为了子孙后代,您的算法:

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

@keune:周六或周日就是一个例子。我可能需要计算几个月没有星期一和星期四,几个月没有星期三和星期四。@SuryaS上面提到的问题的公认答案也可以为您计算。我可能会去
$myTime=strottime(“+1天”,“$myTime”)而不是仅仅增加86400秒,因为我注意到,出于某种原因,增加一天的秒数并不总能产生一致的结果。我喜欢这种方法,而且效果很好+1.
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
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