Foros del Web » Programando para Internet » PHP »

Calcular Numero de dias y de domingos entre 2 fechas dadas

Estas en el tema de Calcular Numero de dias y de domingos entre 2 fechas dadas en el foro de PHP en Foros del Web. Cordial saludo... Amigos, en mi aplicacion necesito determinar el numero de horas empleadas para cumplir una Orden de Produccion. El sistema registra la fecha de ...
  #1 (permalink)  
Antiguo 08/04/2009, 15:48
Avatar de rogoelpra  
Fecha de Ingreso: abril-2007
Ubicación: Bucaramanga
Mensajes: 246
Antigüedad: 17 años
Puntos: 2
Calcular Numero de dias y de domingos entre 2 fechas dadas

Cordial saludo...

Amigos, en mi aplicacion necesito determinar el numero de horas empleadas para cumplir una Orden de Produccion.

El sistema registra la fecha de Apertura y la Fecha de cierre de dicha orden pero debo tener en cuenta que de Lunes a Viernes los turnos son de 8 horas (8-12 y 14-16), los sabados de 4 horas (8-12) y los dias domingo no se labora. El otro problema es que tambien se debe tener en cuenta la Hora de Apertura y la hora de Cierre ya que como menciono anteriromente se debe indicar es el total de horas por orden

Para explicarme un poco mejor voy a darles un ejemplo:

Fecha de Apertura: 2009-03-27 10:15:00
Fecha de Cierre: 2009-04-08 11:30:00

2009-03-27 5.75
2009-03-28 4
2009-03-29 0
2009-03-30 8
2009-03-31 8
2009-04-01 8
2009-04-02 8
2009-04-03 8
2009-04-04 3.5

Eso me daria un total de 53.25 Horas

Espero puedan ayudarme... De antemano muchas Gracias.

  #2 (permalink)  
Antiguo 11/04/2009, 12:48
 
Fecha de Ingreso: abril-2009
Mensajes: 6
Antigüedad: 15 años
Puntos: 0
Respuesta: Calcular Numero de dias y de domingos entre 2 fechas dadas

Espero que con esto te ayude...

Recibo datos de un formuario desde el cual envio el dia 'uno' y el dia 'dos'

// ------------------------------------------
//Compruebo los datos
if ($_POST["f_uno"]!=""){
}
else {
header("Location: ../error/error.php?error=loqueseauno");
exit;
}
if ($_POST["f_dos"]!=""){
}
else {
header("Location: ../error/error.php?error=loqueseauno");
exit;
}
// ------------------------------------------
//Reviso que las fechas esten bien con expresiones regulares
$revisa_fecha=$_POST['f_uno'];
// Declaro funcion
function revisar_f($revisa_fecha) {
if (!ereg ("([0-9]{2})/([0-9]{2})/([0-9]{4})", $revisa_fecha )) {
return FALSE;
} else {
return TRUE;
}
}
// Consulto si hubo coincidencias
if(revisar_f($revisa_fecha))
{
} else {
header("Location: ../error/error.php?error=loqueseatres");
exit;
}
$r_fecha=$_POST['f_dos'];
// Declaro funcion
function rv_f($r_fecha) {
if (!ereg ("([0-9]{2})/([0-9]{2})/([0-9]{4})", $r_fecha )) {
return FALSE;
} else {
return TRUE;
}
}
// Consulto si hubo coincidencias
if(rv_f($r_fecha))
{
} else {
header("Location: ../error/error.php?error=loqueseacuatro");
exit;
}
// ------------------------------------------
// Converimos los datos (fechas) de ddmmyyyy a yyyymmdd
if ($_POST["f_uno"]!=""){
$txt1_fecha = $_POST["f_uno"];
list($dia, $mes, $ano) = explode('/',$txt1_fecha);
$a_1ver = array("$ano-$mes-$dia");
$dia_inicio = implode("-", $a_1ver);
}

if ($_POST["f_dos"]!=""){
$txt2_fecha = $_POST["f_dos"];
list($dia_d, $mes_d, $ano_d) = explode('/',$txt2_fecha);
$a_2ver = array("$ano_d-$mes_d-$dia_d");
$dia_final = implode("-", $a_2ver);
}
// ------------------------------------------
require ("dias_habiles.php");
// Calculo de Dias Habiles
echo "Dias Habiles Transcurridos entre el";
echo "<br>";
echo "$dia_inicio y el $dia_final";
echo "<br>";
echo "<br>";
echo saberdhabil("$dia_inicio","$dia_final",$diaslibres );

Creo que podrias adaptar esto a lo que estas necesitando
Fijate el funcionamiento
Para mi eliminaria la linea....

...if ($primer_dia_semana <= 6 && 6 <= $ultimo_dia_semana) $sin_resto_dias--...

asi tendrias incluido el dia sabado....
Ademas buscaria que me sume los dias sabado que enontro como
coincidencia asi lo multiplicas por la cantidad de horas que se trabaja
ese dia...Luego haces lo mismo con los demas dias


Este es el archivo que llamas...dias_habiles.php

Archivo dias_habiles
// ------------------------------------------------------------
// Calculo de dias habiles entre dos fechas dadas
// Un dia inicial y un dia Final
// Permite completar un array con los dias feriados
// ------------------------------------------------------------
// Declaro la funcion
function saberdhabil($diainicio,$diafinal,$diaslibres){
//Se calcula el numero de segundos y lo dividimos por 60*60*24 (86400)
//Sumar uno para incluir ambas fechas en el resultado
$dias = (strtotime($diafinal) - strtotime($diainicio)) / 86400 + 1;

$semana_incompleta = floor($dias / 7);
$sin_resto_dias = fmod($dias, 7);

//Las variables asumen 1 si es Lunes,...,6 por Sabado y 7 por Domingo
$primer_dia_semana = date("N",strtotime($diainicio));
$ultimo_dia_semana = date("N",strtotime($diafinal));

//Ambas fechas pueden ser iguales en anos bisiestos (29 de Febrero) --- Se agrega el signo igual
//En el primer caso, el intervalo entero esta dentro de una semana, en el segundo caso el intervalo cae en dos semanas.
if ($primer_dia_semana <= $ultimo_dia_semana){
if ($primer_dia_semana <= 6 && 6 <= $ultimo_dia_semana) $sin_resto_dias--;
if ($primer_dia_semana <= 7 && 7 <= $ultimo_dia_semana) $sin_resto_dias--;
}
else{
if ($primer_dia_semana <= 6) {
//En caso de que el intervalo caiga en dos semanas, seguro habra un Domingo intermedio
$sin_resto_dias--;
}
}

//Operacion... Dias Laborables ... (numero de semanas entre los dos dias) * (5 dias habiles) + el resto
$dias_laborables = $semana_incompleta * 5;
if ($sin_resto_dias > 0 )
{
$dias_laborables += $sin_resto_dias;
}

//Restamos los dias festivos (o vacaciones)
foreach($diaslibres as $dialibre){
$time_stamp=strtotime($dialibre);
//
//Si los dias festivos no caen en el fin de semana
if (strtotime($diainicio) <= $time_stamp && $time_stamp <= strtotime($diafinal) && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7)
$dias_laborables--;
}

return $dias_laborables;
}
//Aca pones los dias que sean feriados como fechas patrias etc etc
$diaslibres=array("2008-12-25","2008-12-26","2009-01-01");


Espero que te sea de ayuda...culquier cosa avisame
  #3 (permalink)  
Antiguo 13/04/2009, 09:17
Avatar de rogoelpra  
Fecha de Ingreso: abril-2007
Ubicación: Bucaramanga
Mensajes: 246
Antigüedad: 17 años
Puntos: 2
Ante todo mil Gracias Nauz... Gracias por tu esfuerzo y ayuda.

Acaobo de revisar tu respuesta y esta muy interesante... Me pondre a analizarla y a tratar de ajustarla a mis necesidades.

Sin embargo te cuento que no ere necesario la revision de si los fachas son validas ya que estas son dadas por el mismo sistema. Es decir, Una vez se abra la orden automaticamente el sistema registrara la fecha de apertura y una vez se cierre el sistema dara la fecha de cierre.

Esto lo hago usando la funcion $fecha_guardo=(date("Y-m-d H:i:s"));

Como te digo voy a revisar y te cuento.

Mil Gracias

Hola de Nuevo Nauz...

He revisado tu Codigo y en efecto esta muy bien indidicandome la cantidad de dias habiles...

El Inconveniente que encuentro es que esta tomando el sabado como dia habil tambien... Como podria hacer para que dijera el total de dias habiles (lunes a Viernes), El total de dias Domingos o Festivos y el total de dias sabados?

Mil Gracias


Última edición por GatorV; 13/04/2009 a las 13:44
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 02:43.