2010-07-28 38 views
8

Dadas las siguientes fechas:Obtener rango de fechas entre dos fechas excluyendo fines de semana

6/30/2010 - 7/6/2010 

y una variable estática:

$h = 7.5 

que necesito para crear una matriz como:

Array ([2010-06-30] => 7.5 [2010-07-01] => 7.5 => [2010-07-02] => 7.5 => [2010-07-05] => 7.5 => [2010-07-06] => 7.5) 

Días de fin de semana excluidos.

No, no es tarea ... por alguna razón no puedo pensar bien hoy.

+0

Enumere las fechas, usando 'getdate (iter_date) [" wday "]' para omitir el fin de semana (wday: 0 o 6). – pascal

Respuesta

23

Para PHP> = 5.3.0, use la clase DatePeriod. Desafortunadamente, apenas está documentado.

$start = new DateTime('6/30/2010'); 
$end = new DateTime('7/6/2010'); 
$oneday = new DateInterval("P1D"); 

$days = array(); 
$data = "7.5"; 

/* Iterate from $start up to $end+1 day, one day in each iteration. 
    We add one day to the $end date, because the DatePeriod only iterates up to, 
    not including, the end date. */ 
foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) { 
    $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */ 
    if($day_num < 6) { /* weekday */ 
     $days[$day->format("Y-m-d")] = $data; 
    } 
}  
print_r($days); 
+0

Cuando ejecuto esto obtengo Matriz ([2010-06-30] => 7.5 [2010-07-01] => 7.5 [2010-07-02] => 7.5 [2010-07-05] => 7.5) Falta el último día, 7/6. ¿Me falta algo simple? – Jason

+0

Parece que cambiar $ end = '7/6/2010'; a $ end = date ('m/d/Y', strtotime ('+1 day', strtotime ('7/06/2010'))); Me da lo que estoy buscando. – Jason

+0

Sí, DatePeriod aparentemente detiene _antes de la fecha final. Mi mal, arreglado. – gnud

3

El método más simple:

$start = strtotime('6/30/2010'); 
$end = strtotime('7/6/2010'); 
$result = array(); 
while ($start <= $end) { 
    if (date('N', $start) <= 5) { 
     $current = date('m/d/Y', $start); 
     $result[$current] = 7.5; 
    } 
    $start += 86400; 
} 
print_r($result); 

ACTUALIZACIÓN: He olvidado saltarse los fines de semana. Esto debería funcionar ahora.

+1

Tenga cuidado con los ahorros de luz diurna –

+0

Hmm ... Buen punto. – Stephen

+1

Buena respuesta, para el lugar sin horario de verano :) – Shiro

1

Esta es la respuesta de gnud sino como una función (también añade una opción para excluir el día actual del cálculo):

(ejemplos a continuación)

public function getNumberOfDays($startDate, $endDate, $hoursPerDay="7.5", $excludeToday=true) 
{ 
    // d/m/Y 
    $start = new DateTime($startDate); 
    $end = new DateTime($endDate); 
    $oneday = new DateInterval("P1D"); 

    $days = array(); 

    /* Iterate from $start up to $end+1 day, one day in each iteration. 
    We add one day to the $end date, because the DatePeriod only iterates up to, 
    not including, the end date. */ 
    foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) { 
     $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */ 
     if($day_num < 6) { /* weekday */ 
      $days[$day->format("Y-m-d")] = $hoursPerDay; 
     } 
    }  

    if ($excludeToday) 
     array_pop ($days); 

    return $days;  
} 

Y utilizarlo:

$date1 = "2012-01-12"; 
$date2 = date('Y-m-d'); //today's date 

$daysArray = getNumberOfDays($date1, $date2); 

echo 'hours: ' . array_sum($daysArray); 
echo 'days: ' . count($daysArray); 
+0

hola @jarrod, quiero minutos toooo. – User1988

0

Este es el enfoque OOP, por las dudas. Devuelve una matriz con todas las fechas, excepto los fines de semana.

class Date{ 
     public function getIntervalBetweenTwoDates($startDate, $endDate){ 
      $period = new DatePeriod(
       new DateTime($startDate), 
       new DateInterval('P1D'), 
       new DateTime($endDate) 
      ); 
      $all_days = array();$i = 0; 
      foreach($period as $date) { 
       if ($this->isWeekend($date->format('Y-m-d'))){ 
        $all_days[$i] = $date->format('Y-m-d'); 
        $i++; 
       } 
      } 
      return $all_days; 
     } 
     public function isWeekend($date) { 
      $weekDay = date('w', strtotime($date)); 
      if (($weekDay == 0 || $weekDay == 6)){ 
       return false; 
      }else{ 
       return true; 
      } 
     } 
    } 
    $d = new Date(); 
    var_dump($d->getIntervalBetweenTwoDates('2015-08-01','2015-08-08')); 
+0

¿Qué pasa si tienes dos fechas iguales? var_dump ($ d-> getIntervalBetweenTwoDates ('2015-08-01', '2015-08-01')) – SuperManSL

Cuestiones relacionadas