getMonth w javascript podaje ostatni miesiąc

139

Używam datepickera, który podaje datę w formacie Sun Jul 7 00:00:00 EDT 2013. Mimo że miesiąc wskazuje lipiec, jeśli wykonam getMonth, otrzymam miesiąc poprzedni.

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

Co ja robię źle?

programista747
źródło
14
Tak ... to jest indeksowane przez zero .
Emissary
2
Nie trać zmysłów z datami w javascript. Jeśli możesz, korzystaj z
Moment.js
6
Nie mogę uwierzyć, jakie to prawdziwe
neaumusic
Moment.js nie może poprawnie wykonać dateDiffs. W porządku, jeśli robisz dateDiffs w tym samym miesiącu, ale spróbuj to zrobić w 2 różnych miesiącach (tj. 27-04-2018 i 24-05-2018) i jest to dzień wolny.
rozza
1
Poczekaj, aż spróbujesz getYear()!! ;-)
James Poulose

Odpowiedzi:

266

Ponieważ getmonth () zaczyna się od 0. Być może będziesz musiał d1.getMonth() + 1osiągnąć to, co chcesz.

Rahul Tripathi
źródło
194
Muszę powiedzieć, że indeksowanie miesiąca o numerze zero jest najgłupszą rzeczą, jaką widziałem od jakiegoś czasu. '
LarryBud
5
dlaczego ktoś miałby chcieć, aby była oparta na 0, jeśli getDate podaje 1-31?
Abhinav Gauniyal
6
Najprawdopodobniej będziesz musiał to zrobić d1.getMonth() < 12 ? d1.getMonth() + 1 : 1- inaczej grudzień byłby 13, nie?
DanielKhan
7
@DanielKhan Nie, ponieważ grudzień byłby 11, więc dodanie 1 do niego dałoby poprawnie 12. Funkcja getMonth () nie powinna nigdy zwracać wartości powyżej 11.
unenthusiasticuser
7
@LarryBud, rozumowanie jest prawdopodobnie takie, że w przeciwieństwie do innych części daty (dzień miesiąca, rok, godziny, minuty, sekundy ...), które są zawsze używane jako liczby, tak jak są, miesiąc jest często konwertowany na tekst, używając tablica nazw, która oczywiście jest oparta na 0. Tak było już w standardowych bibliotekach C, które muszą mieć ponad 40 lat.
jcaron
19

getMonth()funkcja jest indeksowana zerem. Musisz zrobićd1.getMonth() + 1

Ostatnio korzystałem z biblioteki Moment.js i nigdy nie oglądałem się za siebie. Spróbuj!

letiagoalves
źródło
10

Zakładając, że używasz swojej zmiennej

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

Miesiąc wymaga dokładności +1, zaczyna liczyć od 0

d1.getMonth() + 1 // month 

W przeciwieństwie… te metody NIE potrzebują plusa 1

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

I zauważ, że to .getDate()NIE jest .getDay()

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

Mam nadzieję że to pomoże

Podejrzewam, że te metody nie są spójne z powodów historycznych

jasonleonhard
źródło