O algo como esto:
Código PHP:
function e(q,br) {
document.body.appendChild( document.createTextNode(q) );
if(!br) document.body.appendChild( document.createElement("BR") );
}
function id(x) { return document.getElementById(x); }
// intervalos
var P = 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
// devuelve el mismo esquema de objeto de fechas pero acotada entre numeros (milisegundos)
function getIntervaloMS( intervalo ) {
dev = new Object();
for( var i in intervalo )
dev[i] = intervalo[i].getTime();
return dev;
}
Number.prototype.estaEntre = function(a,b) {
return ( (Math.min(a,b)<=this) && (this<=Math.max(a,b)) );
}
for(var i=0, PMS = new Array(); i<P.length; i++) // hallamos cada P en milisegundos (ms)
PMS[i] = getIntervaloMS( P[i] );
for(var i=0; i<PMS.length; i++) { //cada PMS lo comprobamos con los demás
for(var j=0; j<PMS.length; j++) {
if( i==j ) continue; //estamos comparando uno consigo mismo
else {
if( PMS[i].inicio.estaEntre( PMS[j].inicio, PMS[j].fin ) ^ PMS[i].fin.estaEntre( PMS[j].inicio, PMS[j].fin ) ) {
e(' Se han encontrado fechas solapadas: '+i+' con '+j+'. ');
}
else if( PMS[i].inicio.estaEntre( PMS[j].inicio, PMS[j].fin ) && PMS[i].fin.estaEntre( PMS[j].inicio, PMS[j].fin ) ) {
e(' La primera está contenida en la segunda: '+i+' en '+j+'. ');
}
else {
e(' No están solapadas : '+i+' con '+j+'. ');
}
}
}
}
e("fin");