Hola de nuevo:
En el post anterior vimos como sumar o restar días a una fecha dada en javascript, ahora vamos a ver como calcular los días transcurridos entre dos fechas. Para ello vamos a crear una pequeña función:
Actualización: He actualizado la función ya que la original tenía un error y además he reducido el número de lineas de código para conseguir el mismo resultado.// Función para calcular los días transcurridos entre dos fechas restaFechas = function(f1,f2) { var aFecha1 = f1.split('/'); var aFecha2 = f2.split('/'); var fFecha1 = Date.UTC(aFecha1[2],aFecha1[1]-1,aFecha1[0]); var fFecha2 = Date.UTC(aFecha2[2],aFecha2[1]-1,aFecha2[0]); var dif = fFecha2 - fFecha1; var dias = Math.floor(dif / (1000 * 60 * 60 * 24)); return dias; }
Esta función nos devolverá el número de días que han transcurrido entre las dos fechas pasadas.
Las fechas pasadas deben ser dos strings en formato ‘dd/mm/aaaa’.
Un ejemplo de llamada sería este:
var f1 = '10/09/2014'; var f2='15/10/2014'; alert(restaFechas(f1,f2));
Esto nos sacará un alert con el número 35 que son los días transcurridos entre las dos fechas.
Eso es todo por hoy, espero que os sirva de ayuda.
Un saludo, y si aún no lo has hecho no olvides suscribirte a mi blog para no perderte los próximos posts :-),También puedes seguirme en Twitter en @revigames y no olvides que me ayudas mucho si compartes este post en las redes sociales.
Muchas gracias por la info, esta bastante bueno pero ahora me asalta una duda 🙂
Si para restar las fechas y obtener la diferencia en dias. Como se deberia realizar para restar meses o incluso años… La idea es entregar el resultado en funcion de meses o años.
var dias = Math.floor(dif / (1000 * 60 * 60 * 24));
es necesario agregar a la multiplicacion el 30 ??
Math.floor(dif / (1000 * 60 * 60 * 24 * 30));
asumiendo un promedio en la duración de los meses igual a 30 dias.
Atento a tus comentarios se despide
Gonzalo Peña Garay
Hola Gonzalo, dependiendo del grado de precisión que necesites agregar 30 a la multiplicación podría valerte, ten en cuenta que el resultado se redondea a la baja, es decir si ha pasado un mes y 5 días por ejemplo te devolverá que ha pasado un mes, sin decimales. También tienes que tener en cuenta que esta función es útil para contar días, porque todos los días tienen el mismo numero de horas/minutos/seguntos/milisegundos, sin embargo no todos los meses tienen el mismo número de días por lo cual si necesitas mayor precisión tendrás que crear una función mas compleja que tenga en cuenta esto. Buscando en google probablemente encuentres algo ya hecho. Aunque siempre es mas divertido tratar de hacerlo uno mismo ¿no crees?.
Aprovecho para animar a quien se le ocurra una solución mas completa al problema que planteas que lo deje en los comentarios para que sirva de utilidad a otras personas.
Un saludo
Sin lugar a duda, de todos modos primero lo haré sin precisión y luego lo tratare de mejorar.
Si gustas después puedo compartir el código y lo analizas haber si puede ser aporte para tu blog, de todos modos aun estoy recién comenzando y es algo básico pero ese algo básico me costo encontrarlo, atento a tus comentarios se despide
GPG
Bueno finalmente les presento mi código, no es lo mas preciso en el calculo de los meses y años pero si para los dias, de todos modos si alguien lo quiere mejorar bienvenido sea…
Jquery mobile – Ejercicios
Diferencia entre fechas
Eliga la unidad con la que desea trabajar:
Dias
Meses
Anhos
Fecha Inicial:
Fecha Final:
Calcular
Historial de calculos
$(document).ready(function(){
$.datepicker.regional[‘es’] = {
closeText: ‘Cerrar’,
prevText: ”,
currentText: ‘Hoy’,
monthNames: [‘Enero’, ‘Febrero’, ‘Marzo’, ‘Abril’, ‘Mayo’, ‘Junio’, ‘Julio’, ‘Agosto’, ‘Septiembre’, ‘Octubre’, ‘Noviembre’, ‘Diciembre’],
monthNamesShort: [‘Ene’,’Feb’,’Mar’,’Abr’, ‘May’,’Jun’,’Jul’,’Ago’,’Sep’, ‘Oct’,’Nov’,’Dic’],
dayNames: [‘Domingo’, ‘Lunes’, ‘Martes’, ‘Miercoles’, ‘Jueves’, ‘Viernes’, ‘Sabado’],
dayNamesShort: [‘Dom’,’Lun’,’Mar’,’Mie’,’Juv’,’Vie’,’Sab’],
dayNamesMin: [‘Do’,’Lu’,’Ma’,’Mi’,’Ju’,’Vi’,’Sa’],
weekHeader: ‘Sm’,
dateFormat: ‘dd/mm/yy’,
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ”
};
$.datepicker.setDefaults($.datepicker.regional[‘es’]);
$(function () {
$(“#fecha_inicio”).datepicker();
$(“#fecha_final”).datepicker();
});
});
$(“#calculo2”).click(function(){
//var fecha1 = $(‘#fecha_inicio’).val().split(‘/’);
var fecha11 = $(‘#fecha_inicio’).val()
//var fecha2 = $(‘#fecha_final’).val().split(‘/’);
var fecha22 = $(‘#fecha_final’).val()
var dif = restaFechas(fecha11,fecha22);
if($(“#radio-choice-1”).is(“:checked”)){
$(“#etiqueta3”).html(“Dias: “+fecha11+” – “+fecha22+” “+dif+””);
}else{
if($(“#radio-choice-2”).is(“:checked”)){
dif= Math.floor(dif/30);
$(“#etiqueta3”).html(“Meses: “+fecha11+” – “+fecha22+” “+dif+””);
}else{
if($(“#radio-choice-3”).is(“:checked”)){
dif= Math.floor(dif/360);
$(“#etiqueta3”).html(“Anhos: “+fecha11+” – “+fecha22+” “+dif+””);
}
}
}
});
function restaFechas(f1,f2){
var Fecha1 = new Date();
var Fecha2 = new Date();
var aFecha1 = f1.split(‘/’);
var aFecha2 = f2.split(‘/’);
Fecha1.setDate(aFecha1[0]);
Fecha1.setMonth(aFecha1[1]);
Fecha1.setFullYear(aFecha1[2]);
Fecha2.setDate(aFecha2[0]);
Fecha2.setMonth(aFecha2[1]);
Fecha2.setFullYear(aFecha2[2]);
// obtenemos la fecha en milisegundos.
fFecha1=Fecha1.getTime(); // devuelve la fecha en milisegundos
fFecha2=Fecha2.getTime(); // devuelve la fecha en milisegundos
var dif = fFecha2 – fFecha1;
var dias = Math.floor(dif / (1000 * 60 * 60 * 24));
if(dias<0){
return (dias = ((-1*dias)));}
return dias;
}
.circuloBlanco{
float: right;
position:relative;
z-index: 9999999;
background: white;
border-radius: 20px;
width: 40px;
padding: 1px;
text-align: center;
font-weight: bold;
margin-right: 10px !important;
}
Espero que ahora muestre la primera parte del código
/*
Jquery mobile – Ejercicios
Diferencia entre fechas
Eliga la unidad con la que desea trabajar:
Dias
Meses
Anhos
Fecha Inicial:
Fecha Final:
Calcular
Historial de calculos
*/
Muchas gracias por el aporte Gonzalo, seria interesante ver el código html completo para probarlo, no se si lo has intentado, para poder poner < y > de las etiquetas html hay usar los html Entities & l t; y & g t;, es un poco cansado pero wordpress no deja mostrar etiquetas html en los comentarios.
Seria bueno hacer una función que convirtiese los <y> a html entities.
Es una propuesta que lanzo al aire por si a alguien le apetece ;-).
En cualquier caso creo que se entiende la idea de tu código.
Muchas gracias.
Un saludo
creo que deberia dar 35 dias en el tiempo transcurrido en dias no 36
Hola Gerardo, muchas gracias por comentar y avisarme del error.
Efectivamente son 35 y no 36 los días transcurridos entre las dos fechas del ejemplo.
El error consistía en que no había restado 1 al mes ya que para el objeto Date enero es 0 y no 1.
He aprovechado para reescribir la función de otra forma mas óptima utilizando menos lineas de código.
Un saludo.
excelente voy aplicar ya que en el back end con php ya lo aplico pero del lado del cliente nop saludos y gracias por tu aporte
Hola amigo, y en el caso que necesito trabajar con el formato de fecha que da el input date que envía (aaaa/mm/dd), como lo haría??… te agradecería mucho!
Hola Gustavo, para trabajar con formato aaaa/mm/dd puedes cambiar de formato la fecha antes de utilizar la función, o si quieres que la función trabaje directamente en ese formato habría que cambiar el orden en que forma la fecha la función quedando de esta manera:
restaFechas = function(f1,f2)
{
var aFecha1 = f1.split(‘/’);
var aFecha2 = f2.split(‘/’);
var fFecha1 = Date.UTC(aFecha1[0],aFecha1[1]-1,aFecha1[2]);
var fFecha2 = Date.UTC(aFecha2[0],aFecha2[1]-1,aFecha2[2]);
var dif = fFecha2 – fFecha1;
var dias = Math.floor(dif / (1000 * 60 * 60 * 24));
return dias;
}
Un saludo
Gracias por el codigo me sirvio mucho…
Hola Bueno… y para mostrar el resultado en una caja de texto en ves del alert() como seria
Gracias por la ayuda…..
genial gracias, Dios te bendiga
Muy buena solo quiero preguntarte. Cómo sacaría la cantidad de noches.