| Mensaje |
Autor |
Publicado: Mie Mar 26, 2008 5:29 pm |
Citar |
Hola amigos, estoy desarrollando una aplicación en la cual a la fecha actual le tengo que sumar determinados dias (varian, pero van entre los 180 dias y 200 dias, dependiendo la tarea a realizar) en los cuales no tengo que incrementarle los dias sabados y domingos, ya que son inhabiles, el lenguaje es PHP y la Base de datos Mysql. Tengo está función, pero lo malo es que no me respeta sabados y domingos.
Código : <? function sumarmeses ($fechaini, $meses){ //recortamos la cadena separandola en //tres variables de dia, mes y año $dia=substr($fechaini,0,2); $mes=substr($fechaini,3,2); $anio=substr($fechaini,6,4); //Sumamos los meses requeridos $tmpanio=floor($meses/12); $tmpmes=$meses%12; $anionew=$anio+$tmpanio; $mesnew=$mes+$tmpmes; //Comprobamos que al sumar no nos hayamos //pasado del año, si es así incrementamos //el año if ($mesnew>12) { $mesnew=$mesnew-12; if ($mesnew<10) $mesnew="0".$mesnew; $anionew=$anionew+1; } $fecha=date( "Y/m/d", mktime(0,0,0,$mesnew,$dia,$anionew) ); return $fecha; }
//El formato de fecha que pasamos a la función debe ser DD/MM/YYYY $fecha="27/03/2003"; $meses=3;
//Llamada a la función echo sumarmeses ($fecha, $meses); ?>
Gracias |
|
|
atomoclip
clabLevel: 59 
|
|
Volver arriba |
 |
Publicado: Mie Mar 26, 2008 8:29 pm |
Citar |
No queda muy bien explicado lo que realmente quieres, podrias dar un ejemplo con datos de entrada y salida.- Ej:
Código : $fechaInicio = "2008/03/25"; $dias =10; echo sumafechas($fechaInicio,$dias); // devuelve 2008/04/04
Aca de todas maneras hay un tuto de suma de fechas http://www.cristalab.com/foros/t14108.html |
_________________ __________<= |
|
york3rs

clabLevel: 324 
LA___Chile
|
|
Volver arriba |
 |
Publicado: Mie Mar 26, 2008 8:37 pm |
Citar |
Un algoritmo que se me ocurre para ver cuantos dias restar:
Código : Averiguar que dia de la semana corresponde la fecha ingresada Ej: Miercoles = 3 / Sabado = 6 ($diainicio) Sumar $diainicio+$dias ($Totaldias) Al $Totaldias dividir por 3.5 ($diasarestar) Obtener el sustraendo, si $sustrando = 6 => $diasarestar++; para finalizar al $Totaldias-$diasarestar, // para finalizar esto daria los dias sin sabado ni domingos.-
|
_________________ __________<= |
|
york3rs

clabLevel: 324 
LA___Chile
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 2:23 am |
Citar |
Fecha de hoy empieza a ejecutarse las 159 tareas, las 159 tareas se relizaran en 202 dias Hoy empieza, la tarea 1 la tarea 2, se realizará mañana y pasado, menos sabados y domingos sigue el lunes, martes y miercoles toca la tarea 3, la tarea 4 durará 5 dias, jueves, viernes, lunes, martes, miercoles, empieza la tarea 5 que durará 2 dias. En una tabla tengo todo definido los dias por tareas, así colocando las fechas, puedo decir a york3rs, le toca la tarea 5, que durará jueves y viernes, la tarea 6 le tocará a otra persona. Así puedo asignar a cada persona su tarea y el dia en que le toque sus tareas a realizar. Lo que tengo es la fecha cuando inicia las tareas, tengo los dias que transcurriran, pero no deseo que cuando se haga la suma de dias ignore los sabados y domingos. Espero me puedan ayudar. Saludos. |
|
|
atomoclip
clabLevel: 59 
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 2:55 am |
Citar |
un ejemplo un poco mas corto para ver si es asi...
supongamos que arrancando hoy ( 26-03-08 ) tienen que pasar 15 dias "habiles" (sin fines de semana), es decir que esa fecha seria el 16-04-08, correcto.? serìa valida esa fecha para lo que quieres.?
marzo 26 27 ( 1 ) 28 ( 2 ) 29 --> sabado 30 --> domingo 31 ( 3 )
abril 1 ( 4 ) 2 ( 5 ) 3 ( 6 ) 4 ( 7 ) 5 --> sabado 6 --> domingo 7 ( 8 ) 8 ( 9 ) 9 ( 10 ) 10 ( 11 ) 11 ( 12 ) 12 --> sabado 13 --> domingo 14 ( 13 ) 15 ( 14 ) 16 ( 15 ) ... |
|
|
mauril26

clabLevel: 66 
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 2:50 pm |
Citar |
No me acuerdo muy bien pero hay una funcion de php que te da el numero de dias segun una fecha. Ej. 2008/12/31 => 366 y al revez hay otra que di le dices Ej.: 365 => 2008/12/30
Código : Si es como "mauril26" el algoritmo seria algo haci: $fecha = 26-03-08 $masdias= 15; $diadefrecha = 3 (Miercoles) $totaldias = int($masdias+$diadefrecha/5)*2 (Resultado igual a 6, significa que son tres demanas y 2 dias mas por semana) $sustraendo = ($masdias + $diadefrecha) % 5); if ($sustraendo==6) $totaldias++; Si es que sobran 6 dias de la division se suma un dia mas.- $TOTALDIAS = $masdias+$totaldias; (21)
|
_________________ __________<= |
|
york3rs

clabLevel: 324 
LA___Chile
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 3:06 pm |
Citar |
Tal como dice mauril26 es lo que deseo, pero en realidad son mas de 200 dias, y son muchas tareas, tareas que posteriormente necesito que el usuario lo haga, ahora me pongo a ver el ejemplo que envió York3r, les agradesco mucho la ayuda. Saludos y nuevamente gracias. |
|
|
atomoclip
clabLevel: 59 
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 4:09 pm |
Citar |
a ver, un pequeño aporte, es exactamente lo que NO quieres, pero bastaria hallar la diferencia entre dos fechas y restarle el numero de fines de semana (que es lo que se calcula acá) para saber cual es la cantidad de días hábiles:
Código : $libre=0; $dia_inicial=mktime(0,0,0,3,8,2008); $semana_inicial=Date("W", $dia_inicial); $hoy=mktime(0,0,0,Date(m),Date(d),Date(Y)); $semana_actual=Date("W",$hoy); $diferencia = $semana_actual - $semana_inicial;
if ((Date("N", $dia_inicial)) == 7) //domingo $libre=$libre+2; if ((Date("N", $dia_inicial)) == 6) //sábado $libre++; if ((Date("N", $hoy)) == 7) //domingo $libre=$libre+2; if ((Date("N", $hoy)) == 6) //sábado $libre++; echo "Dias libres (fin de semana) entre el 8/03/00 y el ".Date("d\/m\/y").": ".(($diferencia*2)-$libre);
de todos modos pruébalo a ver si no falla... |
|
|
mauril26

clabLevel: 66 
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 4:37 pm |
Citar |
| pero en vez de una fecha final, necesito ir diciendole la cantidad de dias, e incrementandole 2 dias cuando haya un fin de semana, muchas gracias por el aporte mauril26 |
|
|
atomoclip
clabLevel: 59 
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 7:07 pm |
Citar |
Ahora que tengo un poco mas de tiempo voy a transformar mi algorito a codigo.-
..- En minutos veo si es que funciona.- |
_________________ __________<= |
|
york3rs

clabLevel: 324 
LA___Chile
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 7:55 pm |
Citar |
Gracias amigos, viendo el total, puedo hacer que cada tarea sea una función, de esta manera hago pequeñas funciones que sumen solo 3, 6, 9 dias y no el total de dias (más de doscientos dias): Arranco con mi fecha actual en la tarea1, son 3 dias la duración de la tarea1: marzo 27 ( 1 ) 28 ( 2 ) 29 --> sabado 30 --> domingo 31 ( 3 ) guardo la fecha 31/03/2008 y ejecuto la tarea 2, así secesivamente hasta acabar el total de las tareas, como ven? está más fácil así?. Saludos y muchas gracias por su enorme ayuda. |
|
|
atomoclip
clabLevel: 59 
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 10:04 pm |
Citar |
Despues de mucho trabajo al final pude terminar lo que al parecer hacer lo que necesitas. Ojala sirva y funcione.-
Código : <?php
function sumasdiasemana($fecha,$dias) { $datestart= strtotime($fecha); $datesuma = 15 * 86400; $diasemana = date('N',$datestart);
$totaldias = $diasemana+$dias;
$findesemana = intval( $totaldias/5) *2 ;
$diasabado = $totaldias % 5 ; if ($diasabado==6) $findesemana++;
$total = (($dias+$findesemana) * 86400)+$datestart ;
return $twstart=date('Y-m-d', $total); }
echo sumasdiasemana("2008/03/26",260)
?>
>>>.. Por favor no te metas mas en este tipo de problemas.<<<< |
_________________ __________<= |
|
york3rs

clabLevel: 324 
LA___Chile
|
|
Volver arriba |
 |
Publicado: Jue Mar 27, 2008 11:28 pm |
Citar |
York3rs muchas gracias, te prometo en no volver a meterme en este tipo de problemas, te quisiera pedir de favor; una rápida explicación para analizar el código que elaboraste, por ejemplo:
$datesuma = 15 * 86400; el 15 a que corresponde? y el 86400. $diasemana = date('N',$datestart); la 'N';
Fijate que en la fecha si le pongo: echo sumasdiasemana("2008/03/27",1) me retorna: 2008-03-30, deberia de ser: 2008-03-28,
pero si por ejemplo le pongo: echo sumasdiasemana("2008/03/26",1) me retorna: 2008/03/27, es decir super bien.
Te agradesco sinceramente tu ayuda 'muchas gracias' y claro tambien a mauril26.
Saludos. |
|
|
atomoclip
clabLevel: 59 
|
|
Volver arriba |
 |
Publicado: Vie Mar 28, 2008 12:02 am |
Citar |
Debera es porque toma el viernes igual como fin de semana por eso arroja el el Ultimo Domingo, eso se arregla poniendo:
Código : Debajo del otro IF que hay: if ($diasabado==0) $findesemana=$findesemana-2;
|
_________________ __________<= |
|
york3rs

clabLevel: 324 
LA___Chile
|
|
Volver arriba |
 |
Publicado: Vie Mar 28, 2008 12:33 am |
Citar |
York3rs, muchas gracias ya quedó, cuando tengas un momento si me podrías explicar:
$datesuma = 15 * 86400; el 15 a que corresponde? y el 86400. $diasemana = date('N',$datestart); la 'N';
Para poder entender el código, muchas gracias. Saludos |
|
|
atomoclip
clabLevel: 59 
|
|
Volver arriba |
 |
Publicado: Vie Mar 28, 2008 12:08 pm |
Citar |
Te explico un poco, y me di cuenta que algo estaba sobrando:
Código : $datesuma = 15 * 86400; Esto ya no hace nada en el codigo, al final no lo utilizo
Código : diasemana = date('N',$datestart); la 'N'; es para obtener el dia de la semana (Jueves = 4)
|
_________________ __________<= |
|
york3rs

clabLevel: 324 
LA___Chile
|
|
Volver arriba |
 |
Publicado: Vie Mar 28, 2008 3:12 pm |
Citar |
Muchas gracias York3rs.
Saludos |
|
|
atomoclip
clabLevel: 59 
|
|
Volver arriba |
 |
 |