Ver Mensaje Individual
  #6 (permalink)  
Antiguo 13/06/2011, 12:54
Avatar de stramin
stramin
 
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: mejor esta funcion horas habiles

ok, tras analizarlo un rato encontré el problema, hay varios detalles:

1.- cuando cuentes horas recuerda que se trabaja desde 08:00:00 hasta 18:00:00 no se trabaja el minuto 18:00:00, ya que la gente sale a esa hora, por lo tanto debes poner:

$start_time = '08:00:00';
$end_time = '17:59:00';

esos minutos que tenías de más eran por que cada día esta agregando un minuto extra (el minuto 18:00:00)

2.- lo mismo con los días, si calculas desde el 1 de junio al 30 de junio debes poner 1 al 31 para que tome el 30:

$fecha_sol="2011-06-01";
$fecha_menor="2011-06-30";

3.- por último hay un minuto descontado, eso no es necesario, borra este "-1":

$number_of_workminutes = (count($workminutes)-1);

4.- y agregalo al numero de minutos por dia:

$minutes_per_day = (int)( ($end_ts - $start_ts) / 60 )+1;

ya que de lo contrario recibirás 599 minutos por día.

de paso te entrego este código que modifique para hacer las pruebas, te ayudará a entender como funciona :)

Código PHP:
<?php
DEFINE 
('ONEMINUTE'60);

// ESTABLISH THE MINUTES PER DAY FROM START AND END TIMES
$start_time '08:00:00';
$end_time '17:59:00';

$start_ts strtotime($start_time);
$end_ts strtotime($end_time); 
$minutes_per_day = (int)( ($end_ts $start_ts) / 60 )+1;

// ESTABLISH THE HOLIDAYS
$holidays = array
(
'June 6'// MLK Day
'June 17' // MLK Day
);

// CONVERT HOLIDAYS TO ISO DATES
foreach ($holidays as $x => $holiday)
{
$holidays[$x] = date('Y-m-d'strtotime($holiday));
}

$fecha_sol="2011-06-01";
$fecha_menor="2011-06-31";
// CHECK FOR VALID DATES
$start strtotime($fecha_sol);
$end strtotime($fecha_menor);
$start_p date('Y-m-d H:i:s'$start);
$end_p date('Y-m-d H:i:s'$end);

// MAKE AN ARRAY OF DATES
$workdays = array();

// ITERATE OVER THE DAYS
$start $start ONEMINUTE;
while (
$start $end)
{
$start $start ONEMINUTE;
// ELIMINATE WEEKENDS - SAT AND SUN
$weekday date('D'$start);
if (
substr($weekday,0,1) == 'S') continue;
// ELIMINATE HOURS BEFORE BUSINESS HOURS 
$daytime date('H:i:s'$start);
if((
$daytime date('H:i:s',$start_ts))) continue;
// ELIMINATE HOURS PAST BUSINESS HOURS    
$daytime date('H:i:s'$start);
if((
$daytime date('H:i:s',$end_ts))) continue;
// ELIMINATE HOLIDAYS
$iso_date date('Y-m-d'$start);
if (
in_array($iso_date$holidays)) continue;
$workminutes[] = $iso_date;
echo 
count($workminutes)." (".date('H:i:s'$start).") -> ".$iso_date."<br>";
// END ITERATOR
}

// 
$number_of_workminutes = (count($workminutes));
$number_of_minutes number_format($minutes_per_day);
$horas_habiles number_format($number_of_workminutes/60 ,2);

echo 
"$number_of_workminutes<br>$number_of_minutes<br>$horas_habiles<br>$minutes_per_day";
?>
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D