Day difference without weekends Day difference without weekends codeigniter codeigniter

Day difference without weekends


Very easy with my favourites: DateTime, DateInterval and DatePeriod

$start = new DateTime('2012-09-06');$end = new DateTime('2012-09-11');// otherwise the  end date is excluded (bug?)$end->modify('+1 day');$interval = $end->diff($start);// total days$days = $interval->days;// create an iterateable period of date (P1D equates to 1 day)$period = new DatePeriod($start, new DateInterval('P1D'), $end);// best stored as array, so you can add more than one$holidays = array('2012-09-07');foreach($period as $dt) {    $curr = $dt->format('D');    // substract if Saturday or Sunday    if ($curr == 'Sat' || $curr == 'Sun') {        $days--;    }    // (optional) for the updated question    elseif (in_array($dt->format('Y-m-d'), $holidays)) {        $days--;    }}echo $days; // 4


In my case I needed the same answer as OP, but wanted something a little smaller. @Bojan's answer worked, but I didn't like that it doesn't work with DateTime objects, required using timestamps, and was comparing against strings instead of the actual objects themselves (which feels hacky)... Here's a revised version of his answer.

function getWeekdayDifference(\DateTime $startDate, \DateTime $endDate){    $days = 0;    while($startDate->diff($endDate)->days > 0) {        $days += $startDate->format('N') < 6 ? 1 : 0;        $startDate = $startDate->add(new \DateInterval("P1D"));    }    return $days;}

Per @xzdead's comment if you'd like this to be inclusive of the start and end date:

function getWeekdayDifference(\DateTime $startDate, \DateTime $endDate){    $isWeekday = function (\DateTime $date) {        return $date->format('N') < 6;    };    $days = $isWeekday($endDate) ? 1 : 0;    while($startDate->diff($endDate)->days > 0) {        $days += $isWeekday($startDate) ? 1 : 0;        $startDate = $startDate->add(new \DateInterval("P1D"));    }    return $days;}


use DateTime:

$datetime1 = new DateTime('2012-09-06');$datetime2 = new DateTime('2012-09-11');$interval = $datetime1->diff($datetime2);$woweekends = 0;for($i=0; $i<=$interval->d; $i++){    $datetime1->modify('+1 day');    $weekday = $datetime1->format('w');    if($weekday !== "0" && $weekday !== "6"){ // 0 for Sunday and 6 for Saturday        $woweekends++;      }}echo $woweekends." days without weekend";// 4 days without weekends