php - restar - contar sabados y domingos en excel
Obtener el rango de fechas entre dos fechas, excluyendo los fines de semana (4)
Dadas las siguientes fechas:
6/30/2010 - 7/6/2010
y una variable estática:
$h = 7.5
Necesito 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.
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: se olvidó de saltar los fines de semana. Esto debería funcionar ahora.
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);
Esta es la respuesta de gnud pero como una función (también se agregó 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 para usarlo:
$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);
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''));