Calculando o número de sábados e domingos

Como posso calcular o número de sábados e domingos entre duas datas em php?

Existe alguma function incorporada para esse propósito?

Há uma questão relacionada aqui já, Calcule dias úteis

Você pode usar isso para subtrair de 7 para obter os dias de fim de semana, ou similar.

Eu não acho que haja um construído para isso, mas isso deve fazer o trabalho:

$startTime = START_TIMESTAMP; $endTime = END_TIMESTAMP; $time = $startTime; $count = 0; while(date('w', $time) != 0) { // 0 (for Sunday) through 6 (for Saturday) $time += 86400; } while($time < $endTime) { $count++; $time += 7 * 86400; } 

Deixe-nos todos KISS (Keep It Simple Stupid). Por que é tão complicado?

 function countWeekendDays($start, $end) { // $start in timestamp // $end in timestamp $iter = 24*60*60; // whole day in seconds $count = 0; // keep a count of Sats & Suns for($i = $start; $i < = $end; $i=$i+$iter) { if(Date('D',$i) == 'Sat' || Date('D',$i) == 'Sun') { $count++; } } return $count; } 
 < ?php date_default_timezone_set("Europe/Lisbon"); $d1 = new DateTime("2009-06-01"); /* inclusive */ $d2 = new DateTime("2009-07-01"); /* exclusive */ $interval = $d2->diff($d1); $number_of_days = $interval->format("%d"); $number_of_weekends = $number_of_days / 7; $remainder = $number_of_days % 7; if ($remainder >=2 && $d1->format("D") == "Sat") $number_of_weekends++; elseif ($d1->format("w") + $remainder >= 8) $number_of_weekends++; 

Talvez eu tenha perdido por um na última condição, certifique-se de verificar com datas de início diferentes. (Sinta-se livre para editar esta resposta se detectar um erro).

Definitivamente, não existe uma function incorporada para isso, mas você pode usar os dias strtotime to loop

 $start = strtotime('2010-01-01'); $end = strtotime('2010-01-09'); function numWeekdays( $start_ts, $end_ts, $day, $include_start_end = false ) { $day = strtolower( $day ); $current_ts = $start_ts; // loop next $day until timestamp past $end_ts while( $current_ts < $end_ts ) { if( ( $current_ts = strtotime( 'next '.$day, $current_ts ) ) < $end_ts) { $days++; } } // include start/end days if ( $include_start_end ) { if ( strtolower( date( 'l', $start_ts ) ) == $day ) { $days++; } if ( strtolower( date( 'l', $end_ts ) ) == $day ) { $days++; } } return (int)$days; } echo numWeekDays( $start, $end, 'saturday', false ); 

Procurei por algum tempo por uma solução simples que funcionou e decidi escrever o meu próprio e surgiu com isso

  $start = date('Ym-d'); $end = date('Ym-d', strtotime($start.' +1 year')); $current = $start; $count = 0; while($current != $end){ if(date('l', strtotime($current)) == 'Saturday'){ $count++; } $current = date('Ym-d', strtotime($current.' +1 day')); }; echo $count;