【问题标题】:How to count the days without saturday and sunday for a month如何计算一个月没有周六周日的天数
【发布时间】:2015-05-05 02:04:07
【问题描述】:

我正在使用它来动态查找一个月中的总天数

$count = cal_days_in_month(CAL_GREGORIAN, $_POST['PayMonth'], $_POST['PayYear']);

但是我如何计算那个特定月份离开周六和周日的天数?

【问题讨论】:

    标签: php date datetime time


    【解决方案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
    

    参考:link1link2

    【讨论】:

    • $ignore 参数是什么?
    • array(0, 6) 要排除的天数
    • 要排除的天数。 @勒班托。谢谢:)
    【解决方案2】:

    这是用户 cmets 在 PHP 手册中 date() 函数页面上的一个函数。这是对 cme​​ts 中早期功能的改进,增加了对闰年的支持。

    输入开始日期和结束日期,以及可能介于两者之间的任何假期的数组,并将工作日作为整数返回:

    <?php
    //The function returns the no. of business days between two dates and it skips the holidays
    function getWorkingDays($startDate,$endDate,$holidays){
        // do strtotime calculations just once
        $endDate = strtotime($endDate);
        $startDate = strtotime($startDate);
    
    
        //The total number of days between the two dates. We compute the no. of seconds and divide it to 60*60*24
        //We add one to inlude both dates in the interval.
        $days = ($endDate - $startDate) / 86400 + 1;
    
        $no_full_weeks = floor($days / 7);
        $no_remaining_days = fmod($days, 7);
    
        //It will return 1 if it's Monday,.. ,7 for Sunday
        $the_first_day_of_week = date("N", $startDate);
        $the_last_day_of_week = date("N", $endDate);
    
        //---->The two can be equal in leap years when february has 29 days, the equal sign is added here
        //In the first case the whole interval is within a week, in the second case the interval falls in two weeks.
        if ($the_first_day_of_week <= $the_last_day_of_week) {
            if ($the_first_day_of_week <= 6 && 6 <= $the_last_day_of_week) $no_remaining_days--;
            if ($the_first_day_of_week <= 7 && 7 <= $the_last_day_of_week) $no_remaining_days--;
        }
        else {
            // (edit by Tokes to fix an edge case where the start day was a Sunday
            // and the end day was NOT a Saturday)
    
            // the day of the week for start is later than the day of the week for end
            if ($the_first_day_of_week == 7) {
                // if the start date is a Sunday, then we definitely subtract 1 day
                $no_remaining_days--;
    
                if ($the_last_day_of_week == 6) {
                    // if the end date is a Saturday, then we subtract another day
                    $no_remaining_days--;
                }
            }
            else {
                // the start date was a Saturday (or earlier), and the end date was (Mon..Fri)
                // so we skip an entire weekend and subtract 2 days
                $no_remaining_days -= 2;
            }
        }
    
        //The no. of business days is: (number of weeks between the two dates) * (5 working days) + the remainder
    //---->february in none leap years gave a remainder of 0 but still calculated weekends between first and last day, this is one way to fix it
       $workingDays = $no_full_weeks * 5;
        if ($no_remaining_days > 0 )
        {
          $workingDays += $no_remaining_days;
        }
    
        //We subtract the holidays
        foreach($holidays as $holiday){
            $time_stamp=strtotime($holiday);
            //If the holiday doesn't fall in weekend
            if ($startDate <= $time_stamp && $time_stamp <= $endDate && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7)
                $workingDays--;
        }
    
        return $workingDays;
    }
    
    //Example:
    
    $holidays=array("2008-12-25","2008-12-26","2009-01-01");
    
    echo getWorkingDays("2008-12-22","2009-01-02",$holidays)
    // => will return 7
    ?>
    

    【讨论】:

      【解决方案3】:

      这是我用来计算一个月没有周末的天数:

      $nbdayinmonth = cal_days_in_month(CAL_GREGORIAN, $_POST['PayMonth'], $_POST['PayYear']);
      
      $nbday = 0;
      for ($i = 1; $i <= $nbdayinmonth; $i++) {
          $weekday = (int)date("w", strtotime($i . "-" . $_POST['PayMonth'] . "-" . $_POST['PayYear']));
          if ($weekday > 0 && $weekday < 6)
              $nbday++;
      }
      echo $nbday;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多