Ver Mensaje Individual
  #2 (permalink)  
Antiguo 11/04/2009, 12:48
Nauz
 
Fecha de Ingreso: abril-2009
Mensajes: 6
Antigüedad: 15 años, 10 meses
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