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