Sumar días a una fecha en javascript

Hola a todos:

En el post anterior vimos como “Sumar o restar días, semanas, meses o años a una fecha con PHP“.

Hoy me han preguntado como sumar días a una fecha desde javascript y he preparado una función con un pequeño ejemplo de como hacerlo.

La función para sumar o restar días a una fecha seria la siguiente:

Actualización:  La función original se ha modificado debido a un error que provocaba que no se calculasen correctamente algunas fechas, . (Gracias a Edisson y a Gustavo por el aviso). 
// Función que suma o resta días a la fecha indicada

sumaFecha = function(d, fecha)
{
 var Fecha = new Date();
 var sFecha = fecha || (Fecha.getDate() + "/" + (Fecha.getMonth() +1) + "/" + Fecha.getFullYear());
 var sep = sFecha.indexOf('/') != -1 ? '/' : '-';
 var aFecha = sFecha.split(sep);
 var fecha = aFecha[2]+'/'+aFecha[1]+'/'+aFecha[0];
 fecha= new Date(fecha);
 fecha.setDate(fecha.getDate()+parseInt(d));
 var anno=fecha.getFullYear();
 var mes= fecha.getMonth()+1;
 var dia= fecha.getDate();
 mes = (mes < 10) ? ("0" + mes) : mes;
 dia = (dia < 10) ? ("0" + dia) : dia;
 var fechaFinal = dia+sep+mes+sep+anno;
 return (fechaFinal);
 }

La función recibe como parámetros el número de días que se le quiere sumar y la fecha a la  cual que se le van sumar los días.

Si no se le pasa ninguna fecha coge por defecto la fecha actual.

Esta función está pensada para ser usada con fechas en formato dd/mm/aaaa y dd-mm-aaaa. Admite como separador ‘/’ y ‘-‘.

Un ejemplo de llamada seria este:

var fecha = sumaFecha(8,'01/07/2014');
alert(fecha);

En este ejemplo sumaríamos 8 días a la fecha 01/07/2014 sacaría un alert con la fecha ’09/07/2014′.

Espero que os sea de utilidad.

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.

29 comentarios en “Sumar días a una fecha en javascript

    1. Hola Edisson, muchas gracias por avisar del error, efectivamente la función fallaba cuando se excedía del año.
      He actualizado la función utilizando Date.UTC en lugar de setTime.
      En las pruebas que he realizado la nueva función funciona correctamente sumando 10 días a 23/12/1978.

      Un saludo

      1. si sumo 28 días a la fecha 15/11/2014, me devuelve la fecha 10/00/2015… 🙁 🙁
        Además puede dar como resultado 31 de septiembre que es una fecha que no existe, y otros ejemplos similares.
        Qué puede pasar?

        1. Gracias por avisar Gustavo, efectivamente la función no calculaba bien algunas fechas, misterios del manejo de fechas de javascript ;-), he modificado de nuevo la función y en las pruebas que he realizado devuelve resultados correctos, si encontráis algún fallo agradezco que me lo comentéis.

          Un saludo

  1. hola , esta función me ha sido muy útil, pero si deseo cambiar el formato a que sea mm/dd/aaaa, bastaría con modificar “var sFecha = fecha || (Fecha.getDate() + “/” + (Fecha.getMonth() +1) + “/” + Fecha.getFullYear()); ” por var sFecha = fecha || ((Fecha.getMonth() +1) + “/” + Fecha.getDate() + “/” + Fecha.getFullYear()); y el resultado según el formato que deseo?

    porque lo intente y no me resulta, no se que podria cambiar en las operaciones, agradezco mucho esta aportación y la respuesta que me den 🙂

    excelente dia!

    1. Hola Diana, muchas gracias por comentar.

      Para utilizar la función con el formato mm/dd/aaaa tienes dos opciones:
      Transformar la fecha que deseas usar al formato dd/mm/aaaa y despues el resultado volverlo a transformar al formato mm/dd/aaaa, o si prefieres que la función use siempre el formato dd/mm/aaaa tienes que cambiar la función quedando de esta manera:

      sumaFecha = function(d, fecha)
      {
      var Fecha = new Date();
      var sFecha = fecha || ((Fecha.getMonth() +1) + “/” + Fecha.getDate() + “/” + Fecha.getFullYear());

      var sep = sFecha.indexOf(‘/’) != -1 ? ‘/’ : ‘-‘;
      var aFecha = sFecha.split(sep);

      var dias = d || 0;

      var fFecha = Date.UTC(aFecha[2],aFecha[0],aFecha[1])+(86400000*dias); // 86400000 son los milisegundos que tiene un día

      var fechaFinal = new Date(fFecha);

      var anno = fechaFinal.getFullYear();
      var mes = fechaFinal.getMonth();
      var dia = fechaFinal.getDate();
      var mes = (mes < 10) ? ("0" + mes) : mes;
      var dia = (dia < 10) ? ("0" + dia) : dia;
      var fechaFinal = mes+sep+dia+sep+anno;

      return (fechaFinal);

      }

      Un saludo y espero que se sirva de ayuda 🙂

      1. muchas gracias! tenia la idea que tenia que cambiar fFecha pero no estaba segura que orden debia llevar… gracias 🙂 me ha sido muy últil esta función

        saludos!

    1. Hola Pablo, gracias por comentar.La función no trata a todos todos los meses como si tuvieran 31 días, Se genera con el objeto Date de javascrit en función de los mili segundos transcurridos, el objeto Date tiene en cuenta los días que tiene cada mes.

      Un saludo

  2. No se si sera un error, pero si paso la siguiente fecha 12/10/2015 y d = 0 retorna el valor de 11/10/2015.. y si paso d = 1 retorna 12/10/2015

    en mi caso al parametro d le sume 1 y me funciona.. Saludos!

  3. Disculpa el error fue de mi parte debido a que modifique algo de la funcion y no me percate de cambiar otra parte.. Yo queria que la fecha la recibiera en formato “aaaa-mm-dd”..

    Gracias de verdad por este aporte.

  4. Hola Amigo gracias por el aporte….Habria alguna forma de que solo recibiera un parametro del tiempo que quiero que cambie….. y la fecha que cogiera la actual?

  5. Hola, me fue de mucha ayuda tu función. Sería posible que la misma al recibir una fecha vacía, o al no recibirla, no me tome por defecto la actual, sino que no me muestra ningún valor? Gracias

Responder a victor nieto 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.