getMonth en javascript da el mes pasado

139

Estoy usando un selector de fechas que da una fecha en el formato dom 7 de julio 00:00:00 EDT 2013. Aunque el mes dice julio, si hago un mes, me da el mes anterior.

var d1 = new Date("Sun Jul 7 00:00:00 EDT 2013");
d1.getMonth());//gives 6 instead of 7

¿Qué estoy haciendo mal?

desarrollador747
fuente
14
Sí ... es cero indexado .
Emisario
2
No pierdas la cabeza con las fechas en javascript. Usa Moment.js si puedes
Valamas
66
No puedo creer lo real que es esto
neaumusic
Moment.js no puede hacer dateDiffs correctamente. Está bien si estás haciendo DateDiffs dentro del mismo mes, pero trata de hacerlo en 2 meses diferentes (es decir, 27-04-2018 y 24-05-2018) y es un día fuera.
rozza
1
¡Espera hasta que lo intentes getYear()! ;-)
James Poulose

Respuestas:

266

Porque getmonth () comienza desde 0. Es posible que desee tener d1.getMonth() + 1que lograr lo que desea.

Rahul Tripathi
fuente
195
Debo decir que tener un mes número cero indexado es lo más tonto que he visto en mucho tiempo. '
LarryBud
55
¿Por qué alguien querría que sea 0 si getDate da 1-31?
Abhinav Gauniyal
66
Lo más probable es que tengas que hacerlo d1.getMonth() < 12 ? d1.getMonth() + 1 : 1; de lo contrario, diciembre sería el 13, ¿no?
DanielKhan
77
@DanielKhan Nope, porque diciembre sería 11, por lo que agregar 1 sería correctamente 12. La función getMonth () nunca debería devolver un valor superior a 11.
usuario poco entusiasta
77
@LarryBud, el razonamiento es probablemente contrario a otras partes de la fecha (día del mes, año, horas, minutos, segundos ...) que siempre se usan como números, el mes a menudo se convierte en texto, usando una matriz de nombres, que por supuesto está basada en 0. Ya era el caso en las bibliotecas estándar de C, que deben tener más de 40 años.
jcaron
19

getMonth()la función está basada en cero indexado. Necesitas hacerd1.getMonth() + 1

Recientemente utilicé la biblioteca Moment.js y nunca miré hacia atrás. ¡Intentalo!

letiagoalves
fuente
10

Suponiendo que use su variable

var d1 = new Date("Sun Jul 7 00:00:00 EDT 2013");

El mes requiere un +1 para ser exacto, comienza a contar en 0

d1.getMonth() + 1 // month 

Por el contrario ... estos métodos NO necesitan un plus 1

d1.getSeconds()   // seconds 
d1.getMinutes()   // minutes 
d1.getDate()      // date    

Y note que .getDate()NO lo es .getDay()

d1.getDay()       // day of the week as a 

Espero que esto ayude

Sospecho que estos métodos carecen de consistencia por razones históricas

jasonleonhard
fuente