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.
Si a la fecha 23/12/1978 le sumo 10 días la función no cambia el año
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
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?
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
Ahora funciona bien. Muchas gracias!!! 🙂
Muy buena la función Gracias.
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!
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 🙂
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!
Hola . Muy buena función pero no se si me confundo al creer que todos los meses los calcula con 31 días.
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
Buena funcion doc. Te pasaste!
Amigo de verdad muchas gracias por este gran aporte.
Me fue de mucha utilidad. Saludos cordiales.
Hola que una consulta y en JAVA como seria ?
Hola,
Mira a ver si esto te puede ayudar:
http://developando.com/blog/java-sumar-restar-horas-dias-fecha
Una consulta y como seria en Código JAVA?
Muchas gracias, excelente aporte amigo..
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!
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.
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?
Hola Johan, la función puede recibir un único parámetro indicando el número de días a sumar, si no introduces el segundo parámetro ya toma por defecto la fecha actual.
Gracias por su ayuda!!! me sirvio mucho
Muy Buena funcion te pasaste!! saludos
Que tal este retorno, así se puede manipular como un objeto date de javascript.
return new Date(anno, mes – 1, dia);
Hola Esteban, gracias por el aporte 🙂
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
Hola, como sería para sumar minutos a la fecha?
aun buenisimo