Cristalab

Sumas dias a una fecha excepto sabados y domingos

   Foros de discusión -> PHP, MySQL, Linux y Software Libre
Mensaje Autor
Mensaje Publicado: Mie Mar 26, 2008 5:29 pm     Citar   firefox 
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 Genero:Masculino



MP         
Volver arriba
Mensaje Publicado: Mie Mar 26, 2008 8:29 pm     Citar   msie 
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 Genero:Masculino
LA___Chile


MP         
Volver arriba
Mensaje Publicado: Mie Mar 26, 2008 8:37 pm     Citar   msie 
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 Genero:Masculino
LA___Chile


MP         
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 2:23 am     Citar   firefox 
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 Genero:Masculino



MP         
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 2:55 am     Citar   firefox 
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 Genero:Masculino



MP Email       MSN Messenger  
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 2:50 pm     Citar   msie 
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 Genero:Masculino
LA___Chile


MP         
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 3:06 pm     Citar   firefox 
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 Genero:Masculino



MP         
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 4:09 pm     Citar   firefox 
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 Genero:Masculino



MP Email       MSN Messenger  
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 4:37 pm     Citar   firefox 
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 Genero:Masculino



MP         
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 7:07 pm     Citar   msie 
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 Genero:Masculino
LA___Chile


MP         
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 7:55 pm     Citar   firefox 
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 Genero:Masculino



MP         
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 10:04 pm     Citar   msie 
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 Genero:Masculino
LA___Chile


MP         
Volver arriba
Mensaje Publicado: Jue Mar 27, 2008 11:28 pm     Citar   firefox 
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 Genero:Masculino



MP         
Volver arriba
Mensaje Publicado: Vie Mar 28, 2008 12:02 am     Citar   msie 
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 Genero:Masculino
LA___Chile


MP         
Volver arriba
Mensaje Publicado: Vie Mar 28, 2008 12:33 am     Citar   firefox 
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 Genero:Masculino



MP         
Volver arriba
Mensaje Publicado: Vie Mar 28, 2008 12:08 pm     Citar   msie 
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 Genero:Masculino
LA___Chile


MP         
Volver arriba
Mensaje Publicado: Vie Mar 28, 2008 3:12 pm     Citar   firefox 
Muchas gracias York3rs.

Saludos

atomoclip


clabLevel: 59 Genero:Masculino



MP         
Volver arriba
Responder al tema    Foros de discusión -> PHP, MySQL, Linux y Software Libre Todas las horas son GMT
Página 1 de 1

Respuesta Rapida

  Citar el ultimo mensaje
Adjuntar tu firma

Mostrar mensajes de anteriores:
  

 


Cristalab BloodBerry Style © 2006 Cristalab
Powered by phpBB © 2001, 2002 phpBB Group