2009-02-01 18 views
26

He estado usando la fecha de Javascript para un proyecto, pero me di cuenta hoy de que mi código que funcionó anteriormente ya no funciona correctamente. En lugar de producir feb como se esperaba, el código siguiente produce marzo.Javascript Fecha: mes siguiente

Mi código es como la siguiente:

current = new Date(); 
current.setMonth(current.getMonth()+1); //If today is Jan, expect it to be Feb now 

Este código trabajaron todos los días hasta hoy. ¿Es esto un error de Javascript o estoy haciendo esto de la manera incorrecta?

+5

ayer fue 1 de febrero ... – nickf

+9

divertido, la cuestión era pedido el 1 de febrero a las 00:03, por el Cuando terminó su pregunta, ya estaba "fechada": P –

Respuesta

38

Probablemente encontrará que está configurando la fecha para el 31 de febrero de 2009 (si es hoy el 31 de enero) y Javascript automágicamente lo hace a principios de marzo.

Compruebe el día del mes, esperaría que fuera de 1, 2 o 3. Si no es lo mismo que antes de agregar un mes, retroceda un día hasta que el mes cambie nuevamente.

De esta manera, el día "último día de enero" se convierte en "último día de febrero".

EDIT:

Ronald, basado en sus comentarios a otras respuestas, es posible que desee alejarse del comportamiento de borde caso como "lo que sucede cuando trato de hacer febrero 30" o "¿Qué pasa cuando intente hacer 2009/13/07 (aaaa/mm/dd) "(este último aún podría ser un problema incluso para mi solución, por lo que debería probarlo).

En lugar de eso, explícitamente codifico las posibilidades. Ya que no se preocupan por el día del mes (lo que desea el año y el mes que es correcta para el próximo mes), algo como esto debería ser suficiente:

var now = new Date(); 
if (now.getMonth() == 11) { 
    var current = new Date(now.getFullYear() + 1, 0, 1); 
} else { 
    var current = new Date(now.getFullYear(), now.getMonth() + 1, 1); 
} 

Eso le da Ene 1, el año siguiente para cualquier día de diciembre y el primer día del mes siguiente para cualquier otro día. Más código, lo sé, pero hace tiempo que me cansé de codificar los trucos de eficiencia, prefiriendo la legibilidad a menos que haya un claro requerimiento para hacer lo contrario.

+0

Por supuesto, vale la pena mencionar que todo esto depende de en qué fecha de su computadora está configurada. Rara vez es preciso. –

+0

Bueno, @Josh :-) - el mío no sale normalmente en más de unos pocos minutos. No puedo responder por nadie más. Tal vez debería ajustar la respuesta para que diga "le dará el primer día del mes siguiente ** el mes que su computadora cree que es **. – paxdiablo

+0

Esta solución puede no funcionar para zulu time. Mis incrementos están desactivados por la diferencia de zona horaria – Jess

25

su lugar, tratar:

var now = new Date(); 
current = new Date(now.getFullYear(), now.getMonth()+1, 1); 
+0

Esto parece estar funcionando si lo hago current.getMonth() + 1 después de usar su código. ¡Gracias! –

+0

Tenga en cuenta que esto establece el día del mes de nuevo en 1 - ¿Es esto lo que quería? – paxdiablo

+0

Todo lo que quiero hacer es pasar al mes siguiente del mes actual. No me importan los días, solo necesito que el mes sea preciso. –

4

Usted puede usar la biblioteca date.js:

http://code.google.com/p/datejs/

Y justo hacer esto

Date.today().next().month(); 

Tendrá el valor exacto por hoy + 1 mes (días incluidos)

+0

¡Gran biblioteca realmente útil gracias por compartir! – talsibony

1

probar esto:

var a = screen.Data.getFullYear(); 
var m = screen.Data.getMonth(); 
var d = screen.Data.getDate(); 

m = m + 1; 
screen.Data = new Date(a, m, d); 

if (screen.Data.getDate() != d) 
screen.Data = new Date(a, m + 1, 0); 
9

que estaba buscando una solución de una línea sencilla para obtener el próximo mes a través de las matemáticas, así que no tendría que mirar hacia arriba las funciones de fecha Javascript (pereza mental de mi parte) . Extrañamente, no encontré uno aquí.

¡Supere mi breve período de pereza, escribí una y decidí compartir!

Solución:

(new Date().getMonth()+1)%12 + 1 

Para que quede claro por qué esto funciona, vamos a dividirla por la magia!

Obtiene el mes actual (que está en formato 0..11), aumenta en 1 para el mes siguiente y lo ajusta a un límite de 12 por módulo (11% 12 == 11; 12% 12 == 0). Esto regresa el próximo mes en el mismo formato 0..11, por lo que la conversión a un formato que Date() reconocerá (1..12) es fácil: simplemente agregue 1 nuevamente.

Prueba de concepto:

> for(var m=0;m<=11;m++) { console.info("next month for %i: %i", m+1, (m+1)%12 + 1) } 
next month for 1: 2 
next month for 2: 3 
next month for 3: 4 
next month for 4: 5 
next month for 5: 6 
next month for 6: 7 
next month for 7: 8 
next month for 8: 9 
next month for 9: 10 
next month for 10: 11 
next month for 11: 12 
next month for 12: 1 

Así que ahí lo tienen.

+0

no estoy seguro por qué, pero uso esto para llegar al próximo mes (new Date(). GetMonth() + 1)% 12 + 23 –

+1

esto es matemáticas :-) –

0

ah, la belleza de ternarios:

const now = new Date(); 
const expiry = now.getMonth() == 11 ? new Date(now.getFullYear()+1, 0 , 1) : new Date(now.getFullYear(), now.getMonth() + 1, 1); 

sólo una versión más simple de la solución aportada por @paxdiablo y @ Tom

2

Si utiliza moment.js, que tiene una función de complemento. Aquí está el enlace - https://momentjs.com/docs/#/manipulating/add/

moment().add(7, 'months'); 

También escribí una función recursiva en base a la respuesta de paxdiablo añadir un número variable de meses. Por defecto, esta función agregaría un mes a la fecha actual.

function addMonths(after = 1, now = new Date()) { 
     var current; 
     if (now.getMonth() == 11) { 
      current = new Date(now.getFullYear() + 1, 0, 1); 
     } else { 
      current = new Date(now.getFullYear(), now.getMonth() + 1, 1);    
     } 
     return (after == 1) ? current : addMonths(after - 1, new Date(now.getFullYear(), now.getMonth() + 1, 1)) 
    } 

Ejemplo

console.log('Add 3 months to November', addMonths(3, new Date(2017, 10, 27))) 

salida -

Add 3 months to November Thu Feb 01 2018 00:00:00 GMT-0800 (Pacific Standard Time) 
0

Probablemente puede hacer de esta manera

var currentMonth = new Date().getMonth(); 

var monthNames = ["January", "February", "March", "April", "May", "June", 
    "July", "August", "September", "October", "November", "December" 
]; 

for(var i = currentMonth-1 ; i<= 4; i++){ 
console.log(monthNames[i])// make it as an array of objects here 

} 
Cuestiones relacionadas