Calcular días transcurridos entre dos fechas en javascript

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.

15 comentarios en “Calcular días transcurridos entre dos fechas en javascript

  1. 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

    1. 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

      1. 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

  2. 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;
    }

    1. 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

    1. 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.

  3. 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

  4. 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!

    1. 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

Responder a Gonzalo Peña Garay Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.