Foros del Web » Programando para Internet » PHP »

Problema con fechas

Estas en el tema de Problema con fechas en el foro de PHP en Foros del Web. Buenos dias! A ver si me podeis echar un cable. Tengo una base de datos en la que tengo x cursos, tengo 7 columnas cada ...
  #1 (permalink)  
Antiguo 24/09/2009, 01:22
Banshi
Invitado
 
Mensajes: n/a
Puntos:
Problema con fechas

Buenos dias!
A ver si me podeis echar un cable. Tengo una base de datos en la que tengo x cursos, tengo 7 columnas cada una es un dia de la semana y si por ejemplo en lunes tenemos S(si) pues ese día se hace ese curso. Un curso se hace en x dias, y varios dias en semana. Tengo cursos en los que sus clases se pueden dar en 1,2,3,4... dias a la semana y tiene una duración total de x dias. Los demas datos que tengo son la fecha de inicio del curso, la fecha actual, las horas totales del curso y las horas de curso que se hacen cada dia que hay clases(horas diarias).

Lo que necesito saber es, los dias de curso que llevo ejecutados con los datos que tengo. Pongo un ejemplo, por si no me he explicado bien.

Curso Y en el que se dan clases martes y jueves, 2 horas diarias y el curso empezo este 1 de septiembre, hay que averiguar cuantos martes y jueves han pasado hasta dia de hoy, para saber los dias de curso que llevo ejecutados.

Conoceis alguna función en php/javascript en la que se pueda obtener esto?

Gracias a todos y perdonad la parrafada.

Saludos.
  #2 (permalink)  
Antiguo 24/09/2009, 08:46
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: Problema con fechas

No existe una funcion predefinida para eso... pero puedes intentar con esto:
Código PHP:
$fechaCurso '12-03-2009'//fecha de inicio del curso
$diasCurso = array('2','4'); //Martes y Jueves
$hoy '16-06-2009'//fecha ficticia de hoy

echo calculaDiasCursos($hoy,$fechaCurso,$diasCurso);


function 
calculaDiasCursos($hoy,$fechaCurso,$diasCurso){
    
$mkCurso explode('-',$fechaCurso);

    
//1 Lunes al 7 Domingo
    
$diasCount = array('1','2','3','4','5','6','7');
    
$numDias count($diasCount);
    
    
$fechaHoy explode('-',$hoy);
    
    
$semanaAno date('W',mktime(000$fechaHoy[1], $fechaHoy[0], $fechaHoy[2])); //esta semana
    
$diaSemana date('N',mktime(000$fechaHoy[1], $fechaHoy[0], $fechaHoy[2])); //este dia
    
    
$calcula1 mktime(000$mkCurso[1], $mkCurso[0], $mkCurso[2]);
    
$calcula2 mktime(000$fechaHoy[1], $fechaHoy[0], $fechaHoy[2]);
    
    
$diferencia = (intval($calcula2 $calcula1))/24/60/60//dias entre el comienzo del curso y hoy
    
    
$semanaDiff abs(date('W',mktime(000$mkCurso[1], $mkCurso[0], $mkCurso[2])) - $semanaAno); // semanas entre el comienzo y hoy
    
    
$x 0;
    
$contar 0;
    while(
$x <= $semanaDiff){
        if(
$semanaDiff == $x){
            foreach (
$diasCurso as $dia){
                if(
$dia <= $diaSemana){
                    for(
$a=0;$a<$numDias;$a++){
                        if(
$dia == $diasCount[$a]){
                            
$contar++;
                        }
                    }
                }
            }
        }else{
            foreach (
$diasCurso as $dia){
                for(
$a=0;$a<$numDias;$a++){
                    if(
$dia == $diasCount[$a]){
                        
$contar++;
                    }
                }
            }
        }
        
$x++;
    }
    
    return 
$contar;

No esta completamente testeada asi que si falta algo puedes probar y arreglarlo.

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #3 (permalink)  
Antiguo 28/09/2009, 00:45
Banshi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con fechas

Cita:
Iniciado por Marvin Ver Mensaje
No existe una funcion predefinida para eso... pero puedes intentar con esto:
Código PHP:
$fechaCurso '12-03-2009'//fecha de inicio del curso
$diasCurso = array('2','4'); //Martes y Jueves
$hoy '16-06-2009'//fecha ficticia de hoy

echo calculaDiasCursos($hoy,$fechaCurso,$diasCurso);


function 
calculaDiasCursos($hoy,$fechaCurso,$diasCurso){
    
$mkCurso explode('-',$fechaCurso);

    
//1 Lunes al 7 Domingo
    
$diasCount = array('1','2','3','4','5','6','7');
    
$numDias count($diasCount);
    
    
$fechaHoy explode('-',$hoy);
    
    
$semanaAno date('W',mktime(000$fechaHoy[1], $fechaHoy[0], $fechaHoy[2])); //esta semana
    
$diaSemana date('N',mktime(000$fechaHoy[1], $fechaHoy[0], $fechaHoy[2])); //este dia
    
    
$calcula1 mktime(000$mkCurso[1], $mkCurso[0], $mkCurso[2]);
    
$calcula2 mktime(000$fechaHoy[1], $fechaHoy[0], $fechaHoy[2]);
    
    
$diferencia = (intval($calcula2 $calcula1))/24/60/60//dias entre el comienzo del curso y hoy
    
    
$semanaDiff abs(date('W',mktime(000$mkCurso[1], $mkCurso[0], $mkCurso[2])) - $semanaAno); // semanas entre el comienzo y hoy
    
    
$x 0;
    
$contar 0;
    while(
$x <= $semanaDiff){
        if(
$semanaDiff == $x){
            foreach (
$diasCurso as $dia){
                if(
$dia <= $diaSemana){
                    for(
$a=0;$a<$numDias;$a++){
                        if(
$dia == $diasCount[$a]){
                            
$contar++;
                        }
                    }
                }
            }
        }else{
            foreach (
$diasCurso as $dia){
                for(
$a=0;$a<$numDias;$a++){
                    if(
$dia == $diasCount[$a]){
                        
$contar++;
                    }
                }
            }
        }
        
$x++;
    }
    
    return 
$contar;

No esta completamente testeada asi que si falta algo puedes probar y arreglarlo.

Suerte!
Funciona perfectamente, muchas gracias
EDITO: He comprobado la función en más casos y falla :S

Última edición por Banshi; 30/09/2009 a las 02:29
  #4 (permalink)  
Antiguo 30/09/2009, 02:32
Banshi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con fechas

Aún sigo con el problema de encontrar los dias que hay entre una fecha y otra, a ver si alguien le encuentra el fallo a la función hecha por Marvin que yo con los mktime y demas me pierdo, no llego a entender la función :(. Por ejemplo, al contar los lunes, martes, miercoles, jueves y viernes de septiembre, desde el día 1 hasta el día 30, me dice que hay 23 cuando realmente hay 22 días. Otro ejemplo los dias lunes, martes, miercoles, jueves y viernes entre el 22-05-2009 y el 08-06-2009, me dice que hay 16 dias cuando realmente hay 12, a ver si me podeis echar una manita, gracias.

Saludos.

Última edición por Banshi; 30/09/2009 a las 02:44
  #5 (permalink)  
Antiguo 01/10/2009, 03:57
Banshi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con fechas

He encontrado el fallo pero no sé como arreglarlo, pongo un ejemplo:

Tenemos que $diasCurso=array('1','2','3','4','5') y que el curso empieza en martes(osea 2), nos encontramos con esta parte del código.
Código PHP:
else{ 
            foreach (
$diasCurso as $dia){ 
                for(
$a=0;$a<$numDias;$a++){ 
                    if(
$dia == $diasCount[$a]){ 
                        
$contar++; 
                    } 
                } 
            } 
        } 
Entramos en el for y en el if en la primera entrada tendriamos $a=0 y $diasCount[0]=1, como $dia=1 y diasCount[0]=1 contaría, pero el curso empieza en martes, asi que no me tendría que contar el lunes ese. Después de mucho probar me he dado cuenta que siempre cuenta de más cuando el curso empieza a "mitad de semana". Por ejemplo el curso se dá martes,miercoles y jueves, pero comienza un jueves, pues ese martes y miercoles de la semana del comienzo lo contaria y no lo debería hacer. Podríais echarme un cable? gracias.

Saludos.

Última edición por Banshi; 01/10/2009 a las 05:18
  #6 (permalink)  
Antiguo 01/10/2009, 05:18
Avatar de Tokkara  
Fecha de Ingreso: junio-2008
Mensajes: 131
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Problema con fechas

Creo que así es más facil

Código PHP:
$fechaCurso '12-03-2009'//fecha de inicio del curso
$diasCurso = array('2','4'); //Martes y Jueves
$hoy '16-06-2009'//fecha ficticia de hoy

echo calculaDiasCursos($hoy,$fechaCurso,$diasCurso);


function 
calculaDiasCursos($hoy,$fechaCurso,$diasCurso)
{

  
//Pasamos las fechas a timestamp de Unix.
  
$hoy explode('-'$hoy);
  
$fecha explode('-'$fechaCurso);
  
$hoy mktime(000$hoy[1], $hoy[0], $hoy[2]);
  
$fecha mktime(000$fecha[1], $fecha[0], $fecha[2]);

  
//Extraemos las semanas completas que hay entre las 2 fechas
  
$diff $hoy-$fecha;
  
$dias_de_diferencia floor($diff/(24*3600));
  
$semanas_de_diferencia floor($dias_de_diferencia/7);


  
//Contamos los días de cursos en esas semanas completas
  
$dias $semanas_de_direfrencia *sizeof($diasCurso);

  
//Ahora contamos la semana incompleta
  
$diasSemana =  $dias_de_diferencia&#37;7;
  
if($diasSemana 0)
  {

    foreach(
$diasCurso as $d)
    {
      
//si el actual es mayor que el día del curso sumamos uno, sino los dias del curso son mayores que el dia actual. Salimos del bucle
      
if($diasSemanas $d$dias++;
      else break;
    }
  }

  return 
$dias;

Lo unico que hacemos es contar las semanas que hay entre las 2 fechas. y multiplicarlo por los días de curso que hay a la semana. Luego cogemos la última semana incompleta, si existe, y vamos contando día a día.
__________________
Revolucionario controlador de plantillas para php
www.simphple.com
  #7 (permalink)  
Antiguo 01/10/2009, 09:09
Banshi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con fechas

Cita:
Iniciado por Tokkara Ver Mensaje

Lo unico que hacemos es contar las semanas que hay entre las 2 fechas. y multiplicarlo por los días de curso que hay a la semana. Luego cogemos la última semana incompleta, si existe, y vamos contando día a día.
Gracias, por la respuesta, pero así tampoco funciona. Al final lo he solucionado usando el codigo de Marvin, pero añadiendole algo:

Código PHP:
function CALCULA_DIAS($hoy,$fechaCurso,$diasCurso){ 
    
$mkCurso explode('-',$fechaCurso);

    
//1 Lunes al 7 Domingo 
    
$diasCount = array('1','2','3','4','5','6','7'); 
    
    
$numDias count($diasCount);
     
    
$fechaHoy explode('-',$hoy);
     
    
$semanaAno date('W',mktime(000$fechaHoy[1], $fechaHoy[0], $fechaHoy[2])); //esta semana

    
$diaSemana date('N',mktime(000$fechaHoy[1], $fechaHoy[0], $fechaHoy[2])); //Día de la semana en la que termina

//Esto es nuevo con respecto al código de Marvin /////////////////////////////////////      
    
$diaComienzo date('N',mktime(000$mkCurso[1], $mkCurso[0], $mkCurso[2])); //Día de comienzo
/////////////////////////////////////////////////////////////////////       
    
$calcula1 mktime(000$mkCurso[1], $mkCurso[0], $mkCurso[2]);

    
$calcula2 mktime(000$fechaHoy[1], $fechaHoy[0], $fechaHoy[2]);  
    
    
$diferencia ceil(($calcula2 $calcula1)/86400); //dias entre el comienzo del curso y hoy 86400=segundos en un dia

    
$semanaDiff abs(date('W',mktime(000$mkCurso[1], $mkCurso[0], $mkCurso[2])) - $semanaAno); // semanas entre el comienzo y hoy

    
$x 0
    
$contar 0
    while(
$x <= $semanaDiff){
        if(
$semanaDiff == $x){
            foreach (
$diasCurso as $dia){ 
                if(
$dia <= $diaSemana){ 
                    for(
$a=0;$a<$numDias;$a++){ 
                        if(
$dia == $diasCount[$a]){ 
                            
$contar++; 
                        } 
                    } 
                } 
            } 
        }else{ 
            foreach (
$diasCurso as $dia){
                for(
$a=0;$a<$numDias;$a++){ 
                    if(
$dia == $diasCount[$a]){ 
                        
$contar++;
                    } 
                } 
            } 
        } 
        
$x++; 
    } 
//Esto es nuevo con respecto al código de Marvin///////////////////////////                
$resta=0;
    foreach(
$diasCurso as $dia){
        if(
$dia<$diaComienzo)$resta++; }
    
    return 
$contar-$resta;
///////////////////////////////////////////////////////////////

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 11:31.