getMonth em javascript dá no mês passado

139

Estou usando um datepicker que fornece uma data no formato dom 7 de julho 00:00:00 EDT 2013. Mesmo que o mês diga julho, se eu fizer um getMonth, ele me fornecerá o mês anterior.

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

O que estou fazendo de errado?

developer747
fonte
14
Sim ... é zero indexado .
emissário
2
Não perca a cabeça com datas em javascript. Use Moment.js se puder
Valamas
6
Eu não posso acreditar o quão real isso é
neaumusic
Moment.js não pode executar o dateDiffs corretamente. Tudo bem se você estiver fazendo dateDiffs no mesmo mês, mas tente fazê-lo em 2 meses diferentes (ou seja, 27-04-2018 e 24-05-2018) e é um dia de folga.
Rozza
1
Espere até você tentar getYear()!! ;-)
James Poulose 17/02

Respostas:

266

Como getmonth () começa em 0. Você pode ter d1.getMonth() + 1que alcançar o que deseja.

Rahul Tripathi
fonte
195
Eu tenho que dizer, ter um número de mês zero indexado é a coisa mais idiota que já vi há algum tempo. '
LarryBud
5
por que alguém iria querer 0 com base se getDate fornece 1-31?
Abhinav Gauniyal
6
Muito provavelmente você terá que fazer d1.getMonth() < 12 ? d1.getMonth() + 1 : 1- caso contrário, dezembro seria 13, não?
DanielKhan
7
@DanielKhan Não, porque dezembro seria 11, assim que adicionar 1 a seria corretamente fazer a função que 12. O getMonth () não deve nunca retornar um valor mais de 11.
unenthusiasticuser
7
@LarryBud, o raciocínio é provavelmente o contrário de outras partes da data (dia do mês, ano, horas, minutos, segundos ...) que sempre são usadas como números, o mês é frequentemente convertido em texto, usando uma matriz de nomes, que é obviamente baseada em 0. Já era o caso das bibliotecas padrão C, que devem ter mais de 40 anos.
jcaron
19

getMonth()A função é zero indexada com base. Você precisa fazerd1.getMonth() + 1

Recentemente, usei a biblioteca Moment.js e nunca olhei para trás. Tente!

letiagoalves
fonte
10

Presumindo que você use sua variável

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

O mês requer que o +1 seja preciso, ele começa a contar em 0

d1.getMonth() + 1 // month 

Por outro lado .... esses métodos NÃO precisam de mais 1

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

E observe que .getDate()NÃO é .getDay()

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

Espero que isto ajude

Suspeito que esses métodos não tenham consistência por razões históricas

jasonleonhard
fonte