Estoy buscando la forma más fácil y limpia de agregar X meses a una fecha de JavaScript.
Prefiero no manejar la renovación del año o tener que escribir mi propia función .
¿Hay algo incorporado que pueda hacer esto?
javascript
date
Chad
fuente
fuente
Respuestas:
La siguiente función agrega meses a una fecha en JavaScript ( fuente ). Tiene en cuenta las acumulaciones anuales y la duración variable de los meses:
La solución anterior cubre el caso límite de pasar de un mes con un mayor número de días que el mes de destino. p.ej.
Si el día del mes cambia al momento de la solicitud
setMonth
, sabemos que hemos pasado al mes siguiente debido a una diferencia en la duración del mes. En este caso, usamossetDate(0)
para regresar al último día del mes anterior.Nota: esta versión de esta respuesta reemplaza una versión anterior (a continuación) que no manejó con gracia diferentes duraciones de mes.
fuente
addMonths
función aquí que respeta al final del mes (por ejemplo,2012-01-31 + 1 month = 2012-02-29
y así sucesivamente).Estoy usando la biblioteca moment.js para manipulaciones de fecha y hora . Código de muestra para agregar un mes:
fuente
Esta función maneja casos extremos y es rápida:
prueba:
Actualización para fechas no UTC: (por A.Hatchkins)
prueba:
fuente
Teniendo en cuenta que ninguna de estas respuestas tendrá en cuenta el año actual cuando cambia el mes, puede encontrar una que hice a continuación que debería manejarlo:
El método:
Uso:
fuente
Tomado de las respuestas de @bmpsini y @Jazaret , pero sin extender los prototipos: usando funciones simples ( ¿Por qué extender objetos nativos es una mala práctica? ):
Úselo:
fuente
De las respuestas anteriores, el único que maneja los casos extremos (bmpasini de la biblioteca datejs) tiene un problema:
bien pero:
peor :
Esto se debe a que no se configuró la hora, volviendo así a 00:00:00, que luego puede fallar al día anterior debido a cambios de zona horaria o de ahorro de tiempo o lo que sea ...
Aquí está mi solución propuesta, que no tiene ese problema, y también es, creo, más elegante ya que no se basa en valores codificados.
Unidad probada con éxito con:
fuente
Como la mayoría de las respuestas resaltaron, podríamos usar el método setMonth () junto con el método getMonth () para agregar un número específico de meses a una fecha determinada.
Ejemplo: (como lo mencionó @ChadD en su respuesta).
Pero debemos usar esta solución con cuidado, ya que tendremos problemas con los casos límite.
Para manejar casos extremos, la respuesta que se proporciona en el siguiente enlace es útil.
https://stackoverflow.com/a/13633692/3668866
fuente
Solución simple:
2678400000
es 31 días en milisegundosActualizar:
Use estos datos para construir nuestra propia función:
2678400000
- 31 días2592000000
- 30 dias2505600000
- 29 días2419200000
- 28 díasfuente
Los meses tienen un índice basado en 0, debe alertar (4) que es 5 (mayo);
fuente
Solo para agregar a la respuesta aceptada y los comentarios.
fuente
Escribí esta solución alternativa que me funciona bien. Es útil cuando desea calcular el final de un contrato. Por ejemplo, inicio = 2016-01-15, meses = 6, final = 2016-7-14 (es decir, último día - 1):
Ejemplos:
fuente
El siguiente es un ejemplo de cómo calcular una fecha futura con base en la entrada de fecha (membresía_registro_fecha) + meses agregados (membresía meses) a través de campos de formulario.
El campo membershipsmonths tiene un valor predeterminado de 0
Enlace de activación (puede ser un evento de cambio adjunto al campo de término de membresía):
fuente
Como lo demuestran muchas de las respuestas complicadas y feas presentadas, Dates and Times puede ser una pesadilla para los programadores que usan cualquier lenguaje. Mi enfoque es convertir las fechas y los valores 'delta t' en Epoch Time (en ms), realizar cualquier aritmética y luego volver a convertirla en "tiempo humano".
Esto fue escrito para un caso de uso ligeramente diferente, pero debería poder adaptarlo fácilmente para tareas relacionadas.
EDITAR: fuente completa aquí !
fuente
Todo esto parece demasiado complicado y supongo que entra en un debate sobre qué significa exactamente agregar "un mes". ¿Significa 30 días? ¿Significa del 1 al 1? ¿Desde el último día hasta el último día?
Si es esto último, agregar un mes al 27 de febrero lo lleva al 27 de marzo, pero agregar un mes al 28 de febrero lo lleva al 31 de marzo (excepto en los años bisiestos, donde lo lleva al 28 de marzo). Luego, restando un mes del 30 de marzo te da ... 27 de febrero? Quién sabe...
Para aquellos que buscan una solución simple, simplemente agregue milisegundos y listo.
o
fuente
d.setMonth(d.getMonth()+1)
? Así que esta ni siquiera es la idea más simple.fuente
A veces es útil crear una fecha por un operador como en los parámetros BIRT
Hice 1 mes de regreso con:
fuente
Como se indicó anteriormente, puede agregar un mes a la
Date
función.fuente