Ver Mensaje Individual
  #6 (permalink)  
Antiguo 02/08/2007, 07:38
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 7 meses
Puntos: 45
Re: Solapamiento de fechas...

Te lo he comentado para que lo entiendas un poquito mejor, seguro que leyéndolo bien te haces con ello:

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<
html>
<
head>
<
titlePágina nueva </title>
<
meta name="Author" content="derkeNuke">
<
style type="text/css">
</
style>
</
head>

<
body>

<
script type="text/javascript">
/* La función e(q,br) escribe algo en el documento aunque ya tengamos el documento cargado, se basa en el DOM, y es así de dinámico 
    q - el texto que vamos a escribir (etiquetas HTML no se interpretarán)
    br - boolean opcional: false > No se escribe salto; true o indefinido > Se escribe salto de línea
*/
function e(q,br) {
document.body.appendChilddocument.createTextNode(q) );
if(!
brdocument.body.appendChilddocument.createElement("BR") );
}
/* id(x), un acortamiento de document.getElementById(x) */
function id(x) { return document.getElementById(x); }


/* DEFINICIÓN DE LOS INTERVALOS BASE (método de escritura de objetos JSON)
Conseguiremos un Array de objetos. Cada elemento del array (P[x]) será un objeto con dos propiedades: 'inicio' y 'fin'.
De esta manera P[0].inicio (ó P[0]["inicio"]) nos retornará el objeto Date que tiene la fecha del inicio del intervalo P[0].

A su vez Date también es un objeto con sus métodos y propiedades, de manera que, como en cualquier fecha podemos hacer getFullYear(), con P[0].fin también podremos utilizar ese método: P[0].fin.getFullYear() (=2007)

Recordar que para iniciar un objeto date con un String de formato inglés mm/dd/aaaa
*/
var = new Array();
P[0] = {inicio: new Date('05/05/2007'), fin: new Date('05/30/2007') };        // se solapa con 2
P[1] = {inicio: new Date('06/01/2007'), fin: new Date('06/30/2007') };        // no se solapa con 3, contiene a 3 entero
P[2] = {inicio: new Date('04/01/2007'), fin: new Date('05/05/2007') };        // se solapa con 0
P[3] = {inicio: new Date('06/15/2007'), fin: new Date('06/20/2007') };        // se solapa con 1

/* FUNCIÓN PARA AHORRARNOS OPERACIONES
Ejecuta getTime() y devuelve el mismo esquema de objeto de antes (un objeto con propiedades 'inicio' y 'fin') pero estas propiedades ya no serán objetos Date, sino números (milisegundos obtenidos desde getTime() > ms desde 1970).
Esto es para no hacer getTime() mil veces dentro de los bucles de abajo, pero bueno, podríamos haberlo puesto a lo bestia luego.
*/
function getIntervaloMSintervalo ) {
    
dev = new Object();
    for( var 
i in intervalo )
        
dev[i] = intervalo[i].getTime();
    return 
dev;
}

/* FUNCIÓN MÉTODO DE CUALQUIER NÚMERO QUE NOS DEVUELVE TRUE EN CASO DE QUE UN NÚMERO ESTÉ CONTENIDO EN EL INTERVALO (a,b) Ó (b,a). a Y b CONTENIDOS EN ESE INTERVALO.
    4.estaEntre(1,6) >> true
    6.estaEntre(5,6) >> true
    8.estaEntre(1,4) >> false
*/
Number.prototype.estaEntre = function(a,b) {
    return ( (
Math.min(a,b)<=this) && (this<=Math.max(a,b)) );
}

/* TRANSFORMAMOS CADA INTERVALO QUE TENGAMOS A MILISEGUNDOS CON LA FUNCIÓN getIntervaloMS()
Un bucle for para recorrer todos los elementos de P, y a cada elemento de P le aplicamos getIntervaloMS(), guardando el resultado en otro array que llamaremos PMS y que será tan largo como P.
*/
for(var i=0PMS = new Array(); i<P.lengthi++)    // hallamos cada P en milisegundos (ms)
    
PMS[i] = getIntervaloMSP[i] );

/* RECORREMOS PMS PARA VER SI HAY INTERVALOS QUE SE PISAN */
for(var i=0i<PMS.lengthi++)  {           
    
//cada PMS lo comprobamos con los demás, es decir, hacemos otra vez un bucle con todos los PMS
    
for(var j=0j<PMS.lengthj++) {
        
// Compararemos PMS[i] con los 4 PMS[j]
        
if( i==) continue;        //estamos comparando uno consigo mismo
        
else {
            
// inicioSePisa será true si el valor de inicio de PMS[i] está entre los valores de inicio y fin de PMS[j] (si no false)
            
var inicioSePisa PMS[i].inicio.estaEntrePMS[j].inicioPMS[j].fin );
            
// finSePisa será true si el valor de fin de PMS[i] está entre los valores de inicio y fin de PMS[j] (si no false)
            
var finSePisa PMS[i].fin.estaEntrePMS[j].inicioPMS[j].fin );
            
// Si se pisa inicio ó se pisa fin, pero no los dos a la vez, está solapado
            
if( inicioSePisa finSePisa )        
                
e(' Se han encontrado fechas solapadas: '+i+' con '+j+'. ');
            
// Si se pisa inicio y a la vez se pisa fin, es que una contiene a la otra
            
else if( inicioSePisa && finSePisa )
                
e(' La primera está contenida en la segunda: '+i+' en '+j+'. ');
            
// En otro caso, no estarán solapadas
            
else
                
e(' No están solapadas : '+i+' con '+j+'. ');
        }
    }
}

//fin
e("fin");  


</script>
</body>
</html> 

Si no has entendido algún punto te lo explicaré con gusto.


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.