Respuesta del Ejercicio # 2 del Capítulo 63:
/*----------------------------------------------------------------------------------------------------------------------
--> Capítulo 63: Ejercicio 2 <--
---------------------------------------------------------------------------------------------------------------------*/
function Cap63Ejercicio2CalcularDiasEntreDosFechas() {
/* Recibimos la 1ra fecha en formato español (dd-mm-yyyy) */
var fechaInicial = prompt('Teclee la 1ra fecha (dd-mm-yyyy)');
/* Garantizamos que el usuario teclee la 1ra fecha y que lo haga correctamente */
while ((!fechaInicial) || (fechaInicial.trim().length === 0) || (!verificarFecha(fechaInicial))) {
fechaInicial = prompt('Teclee bien la 1ra fecha (dd-mm-yyyy)');
}
/* Recibimos la 2da fecha en formato español (dd-mm-yyyy) */
var fechaFinal = prompt('Teclee la 2da fecha (dd-mm-yyyy)');
/* Garantizamos que el usuario teclee la 2da fecha y que lo haga correctamente */
while ((!fechaFinal) || (fechaFinal.trim().length === 0) || (!verificarFecha(fechaFinal))) {
fechaFinal = prompt('Teclee bien la 2da fecha (dd-mm-yyyy)');
}
/* Declaro una variable auxiliar necesaria para dar el resultado al usuario */
var resultado = "";
/* Divido en dos arreglos los datos de día, més y año de las dos fechas, que están separados por el caracter "-" */
var inicial = fechaInicial.split("-");
var final = fechaFinal.split("-");
// Obtenemos las dos fechas en milisegundos
var dateStart = new Date(inicial[2], (inicial[1] - 1), inicial[0]);
var dateEnd = new Date(final[2], (final[1] - 1), final[0]);
/* Comparamos las dos fechas y de acuerdo a ello es la respuesta que se le dará al usuario */
if (dateStart < dateEnd) { // Todo correcto
// la diferencia entre las dos fechas la dividimos entre 86 400 000, que es la cantidad de ms que tiene un día
resultado = "La diferencia es de " + Number((dateEnd - dateStart) / 86400000).toFixed(0) + " días";
} else if (dateStart === dateEnd) { // La misma fecha introducida dos veces
resultado = "La fecha inicial es igual a la fecha final (0 días de diferencia)";
} else { // El usuario se equivocó, intercambiando el orden de las fechas (igualmente doy la respuesta)
// la diferencia entre las dos fechas la dividimos entre 86 400 000, que es la cantidad de ms que tiene un día
resultado = "La fecha inicial es posterior a la fecha final \ny la diferencia entre ellas es de " + Number((dateStart - dateEnd) / 86400000).toFixed(0) + " días";
}
/* Muestro el resultado, sea este cual sea */
alert(resultado);
}
/* función para validar una fecha */
function isValidDate(aDay, aMonth, aYear) {
/* El mes en las fechas comienza en índice 0, por lo que se debe reducir en 1 el mes entrante a esta función */
var month = aMonth - 1;
/* Creo una fecha temporal para comprobar con sus funciones la validés de la fecha entrante a esta función */
var dteDate = new Date(aYear, month, aDay);
/* Devuelve si es válida o no (No puede usarse === pues no son del mismo formato y valor las variables a comparar) */
return ((aDay == dteDate.getDate()) && (month == dteDate.getMonth()) && (aYear == dteDate.getFullYear()));
}
/* Función para varificar una fecha en formato español (dd-mm-yyyy), tanto por su formato como por su validés como tal */
function verificarFecha(aFecha) {
/* Por si queremos utilizar el caracter "/" para separar las cifras de la fecha en formato español (dd/mm/yyyy) */
// var patron = new RegExp("^([0-9]{1,2})([/])([0-9]{1,2})([/])(19|20)+([0-9]{2})$");
/* Creamos la expresión regular que describe la fecha en formato español (dd-mm-yyyy) */
var patron = new RegExp("^([0-9]{1,2})([-])([0-9]{1,2})([-])(19|20)+([0-9]{2})$");
/* Ahora varifico si el formato en que está escrito la fecha es el correcto */
if (aFecha.search(patron) === 0) { // Cumple el formato
/* Divido en un arreglo las partes integrantes de la fecha (año, mes, día), que están separadas por el caracterer "-" */
var values = aFecha.split("-");
/* Por último verifico que la fecha sea real (válida) enviando a otra función el día, mes y año */
if (isValidDate(values[0], values[1], values[2])) { // Si es válida
return true;
}
}
/* Si no cumple con ambas condiciones (con un formato correcto y con que sea válida) devuelvo false */
return false;
}