2013-01-14 13 views
6

(new Date('2012-12-01')).getMonth() to 10 zamiast 11 (getMonth jest zindeksowane 0). Testowałem w Firefoksie, Chrome i Node.js. Dlaczego to się dzieje?(nowa data ("2012-12-01")). GetMonth() === 10?

+0

Powrócił 11 (zgodnie z oczekiwaniami), gdy próbowałem go w FF. Z której przeglądarki korzystasz? – nnnnnn

+0

@nnnnnn Nie wiem, co powiedzieć. Zdarza się to w Chrome, Firefox i Node.js. – dbkaplun

+0

Moje przeprosiny; Dziękuję za wyjaśnienie. Poniżej sformułowałem swoją odpowiedź. –

Odpowiedz

7

Występuje problem z strefą czasową. Twój silnik JS interpretuje ciąg znaków jako UTC, ponieważ nie został on dalej określony. Z specification of Date.parse (który jest używany przez new Date):

String może być interpretowana jako czas lokalny, czas UTC, lub raz w innej strefie czasowej, w zależności od zawartości String. Funkcja najpierw próbuje przeanalizować format ciągu zgodnie z regułami określonymi w formacie ciągu daty (15.9.1.15). Jeśli ciąg nie jest zgodny z tym formatem, funkcja może zostać przywrócona do dowolnej specyficznej dla implementacji heurystyki lub formatów daty specyficznych dla implementacji.

W strefie czasowej datetime to Nov 30 2012 19:00:00 GMT-0500 - w listopadzie. Użyj .getUTCMonth(), a otrzymasz grudzień. Jednak nigdy nie ufaj Date.parse, każda przeglądarka robi to inaczej. Więc jeśli nie jesteś w ograniczonym środowisku, takim jak Node.js, zawsze powinieneś parsować swój ciąg (na przykład z regex) i podać go do new Date(Date.UTC(year, month, date, …)).

+0

Zgadzam się, że lepiej jest polegać na konstrukcji obiektu Date przy użyciu dyskretnego wprowadzania danych niż mechanizmu analizy składniowej, który może zachowywać się inaczej w różnych okolicznościach. –

+0

Właściwie uważam, że specyfikacja jest całkiem jasna. Sekcja 15.9.1.15 mówi: "Wartość nieobecnego przesunięcia strefy czasowej to" Z "." ​​(Więc Chrome jest poprawny, Firefox jest nieprawidłowy). – sinelaw

+1

OK, korekta. Wygląda jak [błąd w specyfikacji ES5.1] (https://bugs.ecmascript.org/show_bug.cgi?id=112) - intencją było dopasowanie ISO-8601, gdzie brak Z oznacza czas lokalny (więc mecze Chrome ES5.1, Firefox i IE match ISO-8601) – sinelaw

0

Błąd wynika z przedrostka dnia 01 z wartością 0. Not sure WHY this is, ale jeśli usuniesz zero przed 1, otrzymasz właściwy miesiąc (11).

Co więcej, zaczyna się podawanie niewłaściwego miesiąca w październiku, jeśli oznacza to cokolwiek.

krótkoterminowe fix użyć 1 zamiast 01.

+1

Nie dla mnie. Otrzymuję 'NaN', a nie' 11'. – dbkaplun

2

Dla Firefox's case przynajmniej RFC2822 stwierdza, że ​​date specifications muszą być oddzielone Folding White Space. Wypróbuj (new Date('2012 12 01')).getMonth(); Użycie -, ponieważ separator nie wydaje się być zdefiniowany.

+0

Naprawiono, dzięki! – dbkaplun

+0

Nie ma specyfikacji stwierdzającej, że 'nowa data' użyłaby RGC2822. Opera na przykład poprawnie je analizuje jako "Sat 01 grudnia 2012 01:00:00 GMT + 0100" – Bergi

+0

Myślę, że - JEST zdefiniowany ... jako operator minus 12 - 01 to listopad. –