Bueno, tengo mi script burro jeje
. Supongo que funciona correctamente, da solución, y parece lógica, aunque como dije el problema no lo he resuelto a mano, no puedo saber si es correcta.
Su librería de funciones es esta (básicamente operaciones con fecha). Una función para escribir y 10 funciones más: 6 para obtener datos (obtener horas, minutos, la hora formateada...), 2 funciones de asignación (poner la hora con una cadena hh:mm y sumar un minuto a la hora) y 2 funciones para saber si una hora está entre otras dos:
Código PHP:
function e(q,br) {
document.body.appendChild( document.createTextNode(q) );
if(!br) document.body.appendChild( document.createElement("BR") );
}
// COMPLETAMOS CON CEROS A LA IZQUIERDA AQUELLOS VALORES QUE LO NECESITEN PARA VERLOS BONITOS
Date.prototype.getXXXzeroFilled = function(propiedad) {
var dev = this["get"+propiedad]();
if( (propiedad=="Milliseconds") && (dev<100) && (dev>9) ) dev = "0"+dev;
else if( dev<10 ) dev = (propiedad=="Milliseconds")?"00":"0"+dev;
return dev.toString();
}
Date.prototype.getHoursZeroFilled = function() { return this.getXXXzeroFilled("Hours"); }
Date.prototype.getMinutesZeroFilled = function() { return this.getXXXzeroFilled("Minutes"); }
Date.prototype.getSecondsZeroFilled = function() { return this.getXXXzeroFilled("Seconds"); }
Date.prototype.getMillisecondsZeroFilled = function() { return this.getXXXzeroFilled("Milliseconds"); }
Date.prototype.queHoraEs = function() {
return this.getHoursZeroFilled()+":"+this.getMinutesZeroFilled();
}
/* Coloca la hora con strHora, que tendrá formato hh:mm */
Date.prototype.ponLaHora = function(strHora) {
// tenemos que calcular el número de milisegundos que representa hh:mm --> es (hh-1)*60*60*1000 + mm*60*1000
var arrHora = strHora.split(":");
var ms = (arrHora[0]*1-1)*60*60*1000 + arrHora[1]*60*1000;
this.setTime(ms);
}
/* Suma un minuto a la fecha */
Date.prototype.sumaUnMinuto = function () {
this.setTime( this.getTime()+60*1000 );
}
/* Mira a ver si un numero se encuentra en el intervalo (a,b) o (b,a) */
Number.prototype.estaEntre = function(a,b) {
return ( (Math.min(a,b)<=this) && (this<=Math.max(a,b)) );
}
/* Mira a ver si la fecha actual se encuenta en el rango de horas creado por strHora1 y strHora2 */
Date.prototype.estaEntre = function(strHora1, strHora2) {
//creamos los milisegundos desde strHora1 y strHora2:
var arrHora1 = strHora1.split(":"), arrHora2 = strHora2.split(":");
var ms1 = (arrHora1[0]*1-1)*60*60*1000 + arrHora1[1]*60*1000, ms2 = (arrHora2[0]*1-1)*60*60*1000 + arrHora2[1]*60*1000;
//mis milisegundos
var misMS = this.getTime();
//e("ms1="+ms1+"; ms2="+ms2+"; misMS="+misMS);
return misMS.estaEntre(ms1,ms2);
}
Y el código en sí es cortito y "fácil" de entender:
Código PHP:
var inicioScript = new Date();
// REGISTRO DE LAS ENTRADAS Y SALIDAS DE LOS CLIENTES EN LA TIENDA (17:00 - 20:00)
var clientes = new Array();
clientes[0] = { entrada: "17:05", salida: "17:22" }
clientes[1] = { entrada: "17:08", salida: "17:31" }
clientes[2] = { entrada: "17:11", salida: "17:15" }
clientes[3] = { entrada: "17:14", salida: "17:42" }
clientes[4] = { entrada: "17:24", salida: "17:26" }
clientes[5] = { entrada: "17:24", salida: "17:28" }
clientes[6] = { entrada: "17:29", salida: "17:46" }
clientes[7] = { entrada: "17:30", salida: "17:58" }
clientes[8] = { entrada: "17:46", salida: "17:54" }
clientes[9] = { entrada: "17:48", salida: "18:03" }
clientes[10] = { entrada: "17:49", salida: "17:56" }
clientes[11] = { entrada: "18:00", salida: "18:23" }
clientes[12] = { entrada: "18:02", salida: "18:19" }
clientes[13] = { entrada: "18:13", salida: "18:30" }
clientes[14] = { entrada: "18:33", salida: "18:49" }
clientes[15] = { entrada: "18:38", salida: "18:47" }
clientes[16] = { entrada: "18:58", salida: "19:09" }
clientes[17] = { entrada: "19:04", salida: "19:26" }
clientes[18] = { entrada: "19:07", salida: "19:34" }
clientes[19] = { entrada: "19:19", salida: "19:27" }
clientes[20] = { entrada: "19:23", salida: "19:25" }
clientes[21] = { entrada: "19:27", salida: "19:39" }
clientes[22] = { entrada: "19:31", salida: "19:31" }
clientes[23] = { entrada: "19:31", salida: "19:45" }
clientes[24] = { entrada: "19:36", salida: "19:50" }
clientes[25] = { entrada: "19:40", salida: "19:56" }
clientes[26] = { entrada: "19:43", salida: "20:01" }
clientes[27] = { entrada: "19:45", salida: "19:49" }
clientes[28] = { entrada: "19:48", salida: "20:01" }
clientes[29] = { entrada: "19:49", salida: "20:09" }
var fecha = new Date(); // Una variable de fecha para poder trabajar con ella
// RELLENADO DEL ARRAY CLIENTESDENTRO
var clientesDentro = new Array();
for( fecha.ponLaHora("17:00"); fecha.queHoraEs()!="20:31"; fecha.sumaUnMinuto() ) {
clientesDentro[ fecha.queHoraEs() ]=0;
for(var j=0; j<clientes.length; j++) {
if( fecha.estaEntre( clientes[j].entrada, clientes[j].salida ) ) {
clientesDentro[fecha.queHoraEs()]++;
}
}
}
// IMPRESIÓN DE LOS CLIENTES
e("CLIENTES:");
for(var i in clientes) {
for( var j in clientes[i] ) {
e("clientes["+i+"]["+j+"] = "+clientes[i][j]+" ", j!="salida");
}
}
e(""); e("");
// IMPRESIÓN DE CLIENTESDENTRO
e("CLIENTESDENTRO:");
for(var j in clientesDentro ) {
e("clientesDentro["+j+"] = "+clientesDentro[j]);
}
e(""); e("");
// OBTENEMOS EL MÁXIMO DE CLIENTESDENTRO
var max=0, horaMax;
for( var i in clientesDentro ) {
if( clientesDentro[i] > max ) {
max = clientesDentro[i];
horaMax = i;
}
}
e("LA HORA PUNTA ES "+horaMax+" EN LA QUE HABÍA "+clientesDentro[horaMax]+" CLIENTES EN LA TIENDA.");
var finScript = new Date();
e("Tiempo para el cálculo: "+(finScript.getTime()-inicioScript.getTime())+" ms");
Tiempos de cálculo:
- IE6 >> 282 ms.
- FF2 >> 468 ms.
Solución:
Cita: LA HORA PUNTA ES 19:49 EN LA QUE HABÍA 6 CLIENTES EN LA TIENDA.
Es un poco pesadito, intentemos simplificarlo. Además es limitado, ya que sólo captura la última incidencia de máximos clientes dentro de la tienda. Es decir, no sabemos si antes también hubo 6 clientes, o durante cuanto tiempo ha habido 6 (da la casualidad que sólo hay 6 durante un sólo minuto y una vez).
Bueno, vamos a seguir pensando.