Foros del Web » Programando para Internet » PHP »

mejor esta funcion horas habiles

Estas en el tema de mejor esta funcion horas habiles en el foro de PHP en Foros del Web. bueno.. el codigo funciona bien .. solo que he mirado qe tarda como 10-20 seg en hacerse la operacion no se que pasa pero si ...
  #1 (permalink)  
Antiguo 13/06/2011, 09:38
 
Fecha de Ingreso: mayo-2011
Mensajes: 14
Antigüedad: 12 años, 11 meses
Puntos: 1
mejor esta funcion horas habiles

bueno.. el codigo funciona bien .. solo que he mirado qe tarda como 10-20 seg en hacerse la operacion no se que pasa pero si alguien sabe por que . por favor corrijame y coloque su aporte.. graciass...


DEFINE ('ONEMINUTE', 60);

// ESTABLISH THE MINUTES PER DAY FROM START AND END TIMES

$start_time = '08:00:00';
$end_time = '18:00:00';


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

// 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));
}

// 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;

// END ITERATOR
}



//
$number_of_workminutes = (count($workminutes)-1);
$number_of_minutes = number_format($minutes_per_day);
$horas_habiles = number_format($number_of_workminutes/60 ,2);
  #2 (permalink)  
Antiguo 13/06/2011, 09:50
Avatar de 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

el script solo valida los minutos, por lo tanto los segundos no serán exactos.

puedes intentar dejando la variable ONEMINUTE en un tiempo menor

DEFINE ('ONEMINUTE', 5);

O, quitar el agregado de minute en el start y en el end:

$start = $start - ONEMINUTE;
$start = $start + ONEMINUTE;

prueba ambas opciones.
__________________
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
  #3 (permalink)  
Antiguo 13/06/2011, 09:59
 
Fecha de Ingreso: mayo-2011
Mensajes: 14
Antigüedad: 12 años, 11 meses
Puntos: 1
Respuesta: mejor esta funcion horas habiles

amigo stramin, resulta que ninguna de las opciones que me da me funciona, si le quito el oneminute me da error se pasa mas de 30 seg y se cae dice error por tiempo de respuesta...
al igual q la otra opcion.. ademas el oneminute con el valor 60 es por los segundos de un minutoo....
  #4 (permalink)  
Antiguo 13/06/2011, 10:09
Avatar de 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, explícame que es lo que hace ese código para probar, ya que no se entiende mucho, es para validar o calcular algo?
__________________
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
  #5 (permalink)  
Antiguo 13/06/2011, 11:25
 
Fecha de Ingreso: mayo-2011
Mensajes: 14
Antigüedad: 12 años, 11 meses
Puntos: 1
Respuesta: mejor esta funcion horas habiles

esta bien, resulta que debo saber cuantas horas hay entre dos fechas, pero esta me debe excluir los fines de semana y lo dias festivos, los dias festivos van en un array, solo puse uno, ahora lo que hace el script es que me obtiene todo en minutos, y luego lo paso a horas, pero he mirado que el codigo me demora mucho en hacer las operaciones... y creo que eso no es bueno... tonces lo he publicado para q alguien pueda ayudarme a dupuralo y obtener un mejor rendimiento en ese script..

me hago entender?
  #6 (permalink)  
Antiguo 13/06/2011, 12:54
Avatar de 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
  #7 (permalink)  
Antiguo 13/06/2011, 13:38
 
Fecha de Ingreso: mayo-2011
Mensajes: 14
Antigüedad: 12 años, 11 meses
Puntos: 1
Respuesta: mejor esta funcion horas habiles

Bueno, la verdad no se como agradecerle stramin, me ha ayudado muchisimo, el codigo funciona perfectamente..

God Bless you man :)

Etiquetas: date, diferencias, horas, hours, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:13.