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";
?>