Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] sumar dias habiles en cha mas no dias fines de semana

Estas en el tema de sumar dias habiles en cha mas no dias fines de semana en el foro de PHP en Foros del Web. saludos a todos en el foro hoy vengo a molestarles, me gustaría saber si me pueden ayudar estoy tratando de hacer una función que me ...
  #1 (permalink)  
Antiguo 11/11/2018, 12:36
 
Fecha de Ingreso: marzo-2016
Ubicación: venezuela
Mensajes: 12
Antigüedad: 8 años, 1 mes
Puntos: 0
Mensaje sumar dias habiles en cha mas no dias fines de semana

saludos a todos en el foro hoy vengo a molestarles, me gustaría saber si me pueden ayudar estoy tratando de hacer una función que me permita sumar los días dada una fecha pero que no me cuente los fines de semana.
ahora he conseguido que me sume los días y me los muestre tal como quiero es decir que me sume los días pero cada 5 años me sume 3 días, hasta allí todo bien funciona bien me dice cuantos días le corresponde y los años que tiene.
pero ahora me cambiaron todo y me piden que no sean días continuos sino días hábiles y que comience el primer año con 15 dias y por cada año desde la fecha de ingreso me sume un día mas hasta los 15 años y hay si me pare estoy tratando de resolver pero no doy no se si me pueden orientar.

no se si me doy a entender bien.

coloco el código como lo llevo y como me esta funcionando actualmente.

$fechaIngreso ='2016-02-01';
$fechaSalida ='2018-10-01';

$fechasalida = date("d/m/Y", strtotime($fechaSalida));


$fechaIngresoObj = new DateTime($fechaIngreso);
$fechaSalidaObJ = new DateTime($fechaSalida);
$intervalo = $fechaIngresoObj->diff($fechaSalidaObJ);


$anosEnLaInstitucion=$intervalo->y;


if ($anosEnLaInstitucion<5) {
$fechaEsperada = strtotime($fechaSalida."+ 30 days");
$fecha= date("d/m/Y",$fechaEsperada);
}

if (($anosEnLaInstitucion>5) and ($anosEnLaInstitucion<10)) {
$fechaEsperada = strtotime($fechaSalida."+ 33 days");
$fecha= date("d/m/Y",$fechaEsperada);
}

if (($anosEnLaInstitucion>=10) and ($anosEnLaInstitucion<15)) {
$fechaEsperada = strtotime($fechaSalida."+ 36 days");
$fecha= date("d/m/Y",$fechaEsperada);
}

if (($anosEnLaInstitucion>=15) and ($anosEnLaInstitucion<20)) {
$fechaEsperada = strtotime($fechaSalida."+ 39 days");
$fecha= date("d/m/Y",$fechaEsperada);
}

if ($anosEnLaInstitucion> 20) {
$fechaEsperada = strtotime($fechaSalida."+ 42 days");
$fecha= date("d/m/Y",$fechaEsperada);
}
?>

<?php
if ($anosEnLaInstitucion<5) {
$dias ='30';
}

if (($anosEnLaInstitucion>5) and ($anosEnLaInstitucion<10)) {
$dias ='33';
}

if (($anosEnLaInstitucion>=10) and ($anosEnLaInstitucion<15)) {
$dias ='36';
}

if (($anosEnLaInstitucion>=15) and ($anosEnLaInstitucion<20)) {
$dias ='39';
}

if ($anosEnLaInstitucion> 20) {
$dias ='42';
}
?>

Echo 'Le Corresponden '.$dias.' Dias';
Echo '<p>';
Echo 'Debe Regresar el '.$fecha;
  #2 (permalink)  
Antiguo 11/11/2018, 19:26
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años
Puntos: 120
Respuesta: sumar dias habiles en cha mas no dias fines de semana

pues recorrelo con un bucle todos los dias o semanas, y solo ignora los que sean domingo y sabado o si es por semana, solo resta 2 dias o 1, pero la amyoria de soluciones pasa por lo mismo, ponerlo en un bucle y que se empieze a contar, yo si fuese tu, lo haria por un bucle por dias, ya que podria haber el caso que a futuro de pidan que tambien no cuentes, dias festivos, como navidad, dia nacional etc.
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #3 (permalink)  
Antiguo 12/11/2018, 07:04
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 9 meses
Puntos: 263
Respuesta: sumar dias habiles en cha mas no dias fines de semana

Ve si te sirve esta funcion, recibe un array como con los parametros a procesar y retorna un array con las fechas sin sábados ni domingos, tambien puedes pasarle un array como tercer paranmetro con los dias feriados a excluir del periodo


Código PHP:
Ver original
  1. /**
  2.      * Retorna un array con los dias habiles en un rango dado
  3.      * recibe un arra con la data a procesar
  4.      * array('fecha1','fecha2',array feriados)
  5. * Data ['fecha iniciio','fecha fin',[array de feriados si los hay]]
  6.      */
  7.     function diashabiles($X){
  8.         $timezone = $this->city($this->IPreal())->timezone;
  9.         date_default_timezone_set($timezone);
  10.  
  11.         $inicio = new \DateTime($X[0]);//Inicio
  12.         $final = new \DateTime($X[1]);//Fin
  13.  
  14.         // Meter fecha final en la operación.
  15.         $final->modify('+1 day');
  16.        
  17.         $intervalo = $final->diff($inicio);
  18.        
  19.         //Días totales
  20.         $dias = $intervalo->days;
  21.        
  22.         // Creamos un perido para que imprima los días (P1D es igual a 1 dia)
  23.         $periodo = new \DatePeriod($inicio, new \DateInterval('P1D'), $final);
  24.        
  25.         //Array con días de fiesta
  26.         $holidays = $X[2];//Array con días de fiesta
  27.    
  28.         foreach($periodo as $d) {
  29.             $pos = $d->format('D');
  30.        
  31.             if ($pos == 'Sat' || $pos == 'Sun') {
  32.                 $dias--;
  33.             }
  34.        
  35.             elseif (in_array($d->format('Y-m-d'), $holidays)) {
  36.                 $dias--;
  37.             }
  38.         }
  39.         return $dias;
  40.     }//
__________________
[email protected]
HITCEL
  #4 (permalink)  
Antiguo 12/11/2018, 07:05
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 9 meses
Puntos: 263
Respuesta: sumar dias habiles en cha mas no dias fines de semana

Vse duplico la respuesta.
__________________
[email protected]
HITCEL
  #5 (permalink)  
Antiguo 14/11/2018, 06:02
 
Fecha de Ingreso: marzo-2016
Ubicación: venezuela
Mensajes: 12
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: sumar dias habiles en cha mas no dias fines de semana

Cita:
Iniciado por tuadmin Ver Mensaje
pues recorrelo con un bucle todos los dias o semanas, y solo ignora los que sean domingo y sabado o si es por semana, solo resta 2 dias o 1, pero la amyoria de soluciones pasa por lo mismo, ponerlo en un bucle y que se empieze a contar, yo si fuese tu, lo haria por un bucle por dias, ya que podria haber el caso que a futuro de pidan que tambien no cuentes, dias festivos, como navidad, dia nacional etc.
Saludos gracias por tu ayuda claro la forma a en que lo estructure es en bucles y me gustria mantener la estructura pero lo que no consigo hacer es que comando en si usar para decirle que no me cuente los fines de semana,

probe colocando algo asi como

if ($fin == "Sat")
{
$i--;
}
if ($fin== "Sun")
{
$i--;

pero nada colocando sábado y domingo en ingles pero nada.
  #6 (permalink)  
Antiguo 14/11/2018, 06:14
 
Fecha de Ingreso: marzo-2016
Ubicación: venezuela
Mensajes: 12
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: sumar dias habiles en cha mas no dias fines de semana

Cita:
Iniciado por xfxstudios Ver Mensaje
Ve si te sirve esta funcion, recibe un array como con los parametros a procesar y retorna un array con las fechas sin sábados ni domingos, tambien puedes pasarle un array como tercer paranmetro con los dias feriados a excluir del periodo


Código PHP:
Ver original
  1. /**
  2.      * Retorna un array con los dias habiles en un rango dado
  3.      * recibe un arra con la data a procesar
  4.      * array('fecha1','fecha2',array feriados)
  5. * Data ['fecha iniciio','fecha fin',[array de feriados si los hay]]
  6.      */
  7.     function diashabiles($X){
  8.         $timezone = $this->city($this->IPreal())->timezone;
  9.         date_default_timezone_set($timezone);
  10.  
  11.         $inicio = new \DateTime($X[0]);//Inicio
  12.         $final = new \DateTime($X[1]);//Fin
  13.  
  14.         // Meter fecha final en la operación.
  15.         $final->modify('+1 day');
  16.        
  17.         $intervalo = $final->diff($inicio);
  18.        
  19.         //Días totales
  20.         $dias = $intervalo->days;
  21.        
  22.         // Creamos un perido para que imprima los días (P1D es igual a 1 dia)
  23.         $periodo = new \DatePeriod($inicio, new \DateInterval('P1D'), $final);
  24.        
  25.         //Array con días de fiesta
  26.         $holidays = $X[2];//Array con días de fiesta
  27.    
  28.         foreach($periodo as $d) {
  29.             $pos = $d->format('D');
  30.        
  31.             if ($pos == 'Sat' || $pos == 'Sun') {
  32.                 $dias--;
  33.             }
  34.        
  35.             elseif (in_array($d->format('Y-m-d'), $holidays)) {
  36.                 $dias--;
  37.             }
  38.         }
  39.         return $dias;
  40.     }//
Gracias por la ayuda estoy tratando de entender el codigo para ver como puedo tomarlo para adicionarlo al mio, no tengo mucho tiempo programando y estoy tratando de entenderlo lo mas posible si logro avanzar algo las aviso gracias por la ayuda.
  #7 (permalink)  
Antiguo 14/11/2018, 10:04
Avatar de ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 1 mes
Puntos: 1146
Respuesta: sumar dias habiles en cha mas no dias fines de semana

Prueba con esto
Código PHP:
Ver original
  1. <?php
  2. $total_days = 0;
  3. $startDate = new DateTime('2018-11-01');
  4. $endDate = new DateTime('2018-12-11');
  5. while($startDate->getTimestamp() <= $endDate->getTimestamp()){
  6.     if($startDate->format('l')== 'Saturday' || $startDate->format('l')== 'Sunday'){
  7.         echo $startDate->format('Y-m-d (D)')."<br/>";
  8.     }else{
  9.         $total_days ++;
  10.     }
  11.     $startDate->modify("+1 days");
  12. }
  13.  
  14. echo '<br><br>Total de dias sin fin de semana '.$total_days;

Ejemplo planteado por @abimaelrc en este hilo
http://www.forosdelweb.com/f18/cuant...7/#post3727056
  #8 (permalink)  
Antiguo 14/11/2018, 12:11
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: sumar dias habiles en cha mas no dias fines de semana

Esto se a tratado en otras ocasiones,
Código PHP:
Ver original
  1. $holiday = array(
  2.     '01-01',  //  Año Nuevo (irrenunciable)
  3.     '10-04',  //  Viernes Santo (feriado religioso)
  4.     '11-04',  //  Sábado Santo (feriado religioso)
  5.     '01-05',  //  Día Nacional del Trabajo (irrenunciable)
  6.     '21-05',  //  Día de las Glorias Navales
  7.     '29-06',  //  San Pedro y San Pablo (feriado religioso)
  8.     '16-07',  //  Virgen del Carmen (feriado religioso)
  9.     '15-08',  //  Asunción de la Virgen (feriado religioso)
  10.     '18-09',  //  Día de la Independencia (irrenunciable)
  11.     '19-09',  //  Día de las Glorias del Ejército
  12.     '12-10',  //  Aniversario del Descubrimiento de América
  13.     '31-10',  //  Día Nacional de las Iglesias Evangélicas y Protestantes (feriado religioso)
  14.     '01-11',  //  Día de Todos los Santos (feriado religioso)
  15.     '08-12',  //  Inmaculada Concepción de la Virgen (feriado religioso)
  16.     '13-12',  //  elecciones presidencial y parlamentarias (puede que se traslade al domingo 13)
  17.     '25-12',  //  Natividad del Señor (feriado religioso) (irrenunciable)
  18. );
  19.  
  20. $startDate = (new DateTime( '2018-11-01' ));    //inicia
  21. $endDate = (new DateTime( '2018-11-15' ))->modify('+1 day');    //termina
  22.  
  23. $interval = new DateInterval('P1D');    // intervalo de un día
  24. /** @var \DateTime[] $date_range */
  25. $date_range = new DatePeriod($startDate, $interval ,$endDate); //creamos rango de fechas
  26.  
  27. $workdays = 0;
  28. foreach($date_range as $date){
  29.     //Se considera el fin de semana y los feriados como no hábiles
  30.     if($date->format("N") <6 AND !in_array($date->format("d-m"),$holiday))
  31.         ++$workdays; // se cuentan los días habiles
  32. }
  33.  
  34. var_dump($workdays);
Ahí tienes un ejemplo, que publique por ahí del 2015 si no mal recuerdo aquí en el foro.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 14/11/2018, 14:55
 
Fecha de Ingreso: marzo-2016
Ubicación: venezuela
Mensajes: 12
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: sumar dias habiles en cha mas no dias fines de semana

Cita:
Iniciado por hhs Ver Mensaje
Esto se a tratado en otras ocasiones,
Código PHP:
Ver original
  1. $holiday = array(
  2.     '01-01',  //  Año Nuevo (irrenunciable)
  3.     '10-04',  //  Viernes Santo (feriado religioso)
  4.     '11-04',  //  Sábado Santo (feriado religioso)
  5.     '01-05',  //  Día Nacional del Trabajo (irrenunciable)
  6.     '21-05',  //  Día de las Glorias Navales
  7.     '29-06',  //  San Pedro y San Pablo (feriado religioso)
  8.     '16-07',  //  Virgen del Carmen (feriado religioso)
  9.     '15-08',  //  Asunción de la Virgen (feriado religioso)
  10.     '18-09',  //  Día de la Independencia (irrenunciable)
  11.     '19-09',  //  Día de las Glorias del Ejército
  12.     '12-10',  //  Aniversario del Descubrimiento de América
  13.     '31-10',  //  Día Nacional de las Iglesias Evangélicas y Protestantes (feriado religioso)
  14.     '01-11',  //  Día de Todos los Santos (feriado religioso)
  15.     '08-12',  //  Inmaculada Concepción de la Virgen (feriado religioso)
  16.     '13-12',  //  elecciones presidencial y parlamentarias (puede que se traslade al domingo 13)
  17.     '25-12',  //  Natividad del Señor (feriado religioso) (irrenunciable)
  18. );
  19.  
  20. $startDate = (new DateTime( '2018-11-01' ));    //inicia
  21. $endDate = (new DateTime( '2018-11-15' ))->modify('+1 day');    //termina
  22.  
  23. $interval = new DateInterval('P1D');    // intervalo de un día
  24. /** @var \DateTime[] $date_range */
  25. $date_range = new DatePeriod($startDate, $interval ,$endDate); //creamos rango de fechas
  26.  
  27. $workdays = 0;
  28. foreach($date_range as $date){
  29.     //Se considera el fin de semana y los feriados como no hábiles
  30.     if($date->format("N") <6 AND !in_array($date->format("d-m"),$holiday))
  31.         ++$workdays; // se cuentan los días habiles
  32. }
  33.  
  34. var_dump($workdays);
Ahí tienes un ejemplo, que publique por ahí del 2015 si no mal recuerdo aquí en el foro.

saludos de verdad mucha gracias por la ayuda sera que me puedes explicar un poquito el codigo lo estoy corriendo para tratar de entenderlo pero da error no lo correo claro lo he guardado como ur archi php. entiendo que esto es es donde me muestra como el tiempo o periodo de 1 dias no estoy seguro 'P1D'.?
  #10 (permalink)  
Antiguo 14/11/2018, 15:48
 
Fecha de Ingreso: marzo-2016
Ubicación: venezuela
Mensajes: 12
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: sumar dias habiles en cha mas no dias fines de semana

Gracias por la ayuda con este ejemplo lo e entendido ya le hice unas modificaciones y me veo encaminado gracias a la ayuda de todos,resulta que el ejemplo que coloco hhs me parece interesante los dias feriados no me lo han pedido pero en algun momento a lo mejor lo hagan y seria bien tenerlo pero el ejemplo no consegui que me corriera en cambio ya realice una modificaciones y me funciona en parte bien, cuenta cuantos dias han transcurridos entre fechas sin contar los fines de semana, y me muestra la fecha de salida aunq eso lo colocare luego con un input, pero ya una vez obtenido estos valores ,necesito saber cual seria la fecha de regreso, haciendo un bucle entre la fecha se salida y la fecha de ingreso para obtener los años transcurridos y me diga cuantos dias le corresponden, hasta alli voy bien pero ahora no se como le digo que esos dias me los sume sin los fines de semana. coloco como lo llevo alli corre pero hasta el punto mencionado.

<?php

$total_days = 0;

$fechaIngreso ='2016-02-01';
$fechaSalida ='2018-10-01';

$fechaIngresoObj = new DateTime($fechaIngreso);
$fechaSalidaObJ = new DateTime($fechaSalida);
$tiempotrascurrido = $fechaSalidaObJ->diff($fechaIngresoObj)->y;


if (($tiempotrascurrido>1) and ($tiempotrascurrido<2)) {
$dias ='15';
}

if (($tiempotrascurrido>=2) and ($tiempotrascurrido<3)) {
$dias ='16';
}

if (($tiempotrascurrido>=3) and ($tiempotrascurrido<4)) {
$dias ='17';
}

echo 'Le Corresponden '.$dias.' Dias Habiles';

echo '<br><br>Fecha de Salida '.$fechaSalidaObJ->format('d-m-Y')."<br/>";

/* aqui tengo el dilema ya teniendo los dias como hago que me cargue desde la fecha de salida los dias pero solo habiles*/



while($fechaIngresoObj->getTimestamp() <= $fechaSalidaObJ->getTimestamp()){
if( $fechaIngresoObj->format('l')== 'Monday' ||
$fechaIngresoObj->format('l')== 'Tuesday' ||
$fechaIngresoObj->format('l')== 'Wednesday' ||
$fechaIngresoObj->format('l')== 'Thursday' ||
$fechaIngresoObj->format('l')== 'Friday'

){

//echo $fechaIngreso->format('Y-m-d (D)')."<br/>";


}else{
$total_days ++;
}
$fechaIngresoObj->modify("+1 days");
}

echo '<br><br>Total de dias sin fin de semana '.$total_days;

?>
  #11 (permalink)  
Antiguo 15/11/2018, 06:23
 
Fecha de Ingreso: marzo-2016
Ubicación: venezuela
Mensajes: 12
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: sumar dias habiles en cha mas no dias fines de semana

Me he quedado casi toda la Noche revisando y leyendo y cuadrando y gracias a todos por la ayuda me acararon mucho ya creo que lo tengo listo solo un pequeño detalle al colocar los feriados como el ejemplo de hhs sin el año me da errores por eso debi cambiar algunas cosas,según lo que pude leer y entender, el código ya se puede decir que esta listo solo ese pequeño detalle para poder incluir los feriados coloco el código a ver si ven el error o me orientan, allí me corre bien.

<?php


$fechaIngreso ='2016-02-01';
$fechaSalida ='2018-11-01';


$fechaIngresoObj = new DateTime($fechaIngreso);
$fechaSalidaObJ = new DateTime($fechaSalida);
$tiempotrascurrido = $fechaSalidaObJ->diff($fechaIngresoObj)->y;


if (($tiempotrascurrido>1) and ($tiempotrascurrido<2)) {
$diass ='15';
}

if (($tiempotrascurrido>=2) and ($tiempotrascurrido<3)) {
$diass ='16';
}

if (($tiempotrascurrido>=3) and ($tiempotrascurrido<4)) {
$diass ='17';
}

echo 'Salio '.$fechaSalida.'<br>';
echo 'Le Corresponden '.$diass.' Dias Habiles <br>';



//Arreglo con todos los feriados
$feriados = array(
'2018-11-08', //feriado
'2018-12-25', //feriado
'2018-01-01', //feriado

);
//le Asigno la fecha se salida para que comience a contar
$comienzo = strtotime($fechaSalida);
//Inicializo la Fecha Final
$fecha_venci_noti = $comienzo;
//Inicializo El Contador
$i = 0; while ($i < $diass) {
//Le Sumo un Dia a La Fecha Final que seria la fecha de regreso (86400 Segundos)
$fecha_venci_noti += 86400;
//Inicializo a FALSE La Variable Para Saber Si Es Feriado
$es_feriado = FALSE; //Recorro Todos Los Feriados
foreach ($feriados as $key => $feriado) {
//Verifico Si La Fecha Final Actual Es Feriado O No
if (date("Y-m-d", $fecha_venci_noti) === date("Y-m-d", strtotime($feriado))) {
//En Caso de Ser feriado Cambio Mi variable A TRUE
$es_feriado = TRUE; } }
//Verifico Que No Sea Un Sabado, Domingo O Feriado
if (!(date("w", $fecha_venci_noti) == 6 || date("w", $fecha_venci_noti) == 0 || $es_feriado)) {
//En Caso De No Ser Sabado, Domingo O Feriado Aumentamos Nuestro contador

$i++; } }

// aqui llamaria el guardado a la base de datos para almacenar los datos

//Conversion de los valores para verlos nuevamente en fecha.
$fecha=date("d-m-Y", $fecha_venci_noti);
// anuncio del resulta es decir la fecha de regreso
echo '<br> Debe regresar: '.$fecha;

echo '<br> En la presente fecha ya se han descontado los fines de semana y feriados';

?>

Etiquetas: date, funcion, strtotime
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 15:23.