(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?
Odpowiedz
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, …))
.
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. –
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
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
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.
Nie dla mnie. Otrzymuję 'NaN', a nie' 11'. – dbkaplun
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.
- 1. JavaScript Data metoda niespójność - getDate vs getMonth
- 2. Data i nowa data w kodzie JavaScript
- 3. nowa data(). GetTime() w .NET
- 4. nowa data(). Godzina lub nowa Date.getTime() zwracająca liczbę ujemną?
- 5. d = nowa data(); d.valueOf() kontra Date.now()
- 6. mongo: nowa Data() w zagregowanym $ projekcie
- 7. Okrągła data do przedziału 10 minut
- 8. Dlaczego nowa data (1970, 0, 1) .getFullYear() zwraca 1969?
- 9. Nowa data i godzina API w Java 8
- 10. nowa data(). GetTime() nie zwraca znacznika czasu w milisekundach
- 11. nowa data() pokazuje różnice w wynikach przeglądarki Chrome lub Firefox
- 12. Konwersja (RRRR-MM-DD-HH: MM: SS) Data Data
- 13. Swift 3 IOS 9 i IOS 10 Core Data
- 14. Bootstrap stół żadna nowa linia
- 15. Data/data serwera SQL LIKE wybierz?
- 16. Jeśli javascript "(nowa data()). GetTime()" jest uruchamiana z 2 różnych stref czasowych
- 17. CSS siła nowa linia
- 18. Nowa wielopłytka NSAttributedString
- 19. Nowa linia zapytania SQL
- 20. Lists.newArrayList kontra nowa ArrayList
- 21. nowa linia w pisku
- 22. Nowa linia w Node.js
- 23. GROUP_CONCAT MYSQL nowa linia
- 24. Nowa linia Haskell
- 25. Xamarin.Forms popup "nowa wersja"
- 26. Nowa linia produkcji PHP w pliku tekstowym
- 27. IE 10 + KnockoutJS = HierarchyRequestError?
- 28. warstwowy 10 krotnie krzyż walidacja
- 29. Nowa linia etykiet znaczników osi w Matlab
- 30. Data toLocaleDateString w węźle
Powrócił 11 (zgodnie z oczekiwaniami), gdy próbowałem go w FF. Z której przeglądarki korzystasz? – nnnnnn
@nnnnnn Nie wiem, co powiedzieć. Zdarza się to w Chrome, Firefox i Node.js. – dbkaplun
Moje przeprosiny; Dziękuję za wyjaśnienie. Poniżej sformułowałem swoją odpowiedź. –