Comunidad de diseño web y desarrollo en internet online

Sumas dias a una fecha excepto sabados y domingos

Citar            
MensajeEscrito el 26 Mar 2008 05:29 pm
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

Por atomoclip

61 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 26 Mar 2008 08:29 pm
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

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 26 Mar 2008 08:37 pm
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.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 27 Mar 2008 02:23 am
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.

Por atomoclip

61 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 27 Mar 2008 02:55 am
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 )
...

Por mauril26

161 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 Mar 2008 02:50 pm
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)



Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 27 Mar 2008 03:06 pm
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.

Por atomoclip

61 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 27 Mar 2008 04:09 pm
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...

Por mauril26

161 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 Mar 2008 04:37 pm
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

Por atomoclip

61 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 27 Mar 2008 07:07 pm
Ahora que tengo un poco mas de tiempo voy a transformar mi algorito a codigo.-

..- En minutos veo si es que funciona.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 27 Mar 2008 07:55 pm
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.

Por atomoclip

61 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 27 Mar 2008 10:04 pm
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.<<<<

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 27 Mar 2008 11:28 pm
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.

Por atomoclip

61 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Mar 2008 12:02 am
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;

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 28 Mar 2008 12:33 am
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

Por atomoclip

61 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Mar 2008 12:08 pm
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)

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 28 Mar 2008 03:12 pm
Muchas gracias York3rs.

Saludos

Por atomoclip

61 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 29 May 2015 03:27 pm

york3rs escribió:

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.<<<<

Por jose_pal

0 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.