new Date () działa inaczej w przeglądarce Chrome i Firefox

94

Chcę przekonwertować ciąg daty na Datejavascript, użyj tego kodu:

var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00' to czas UTC w obiekcie JSON z serwera.

Ale wynik powyższego kodu jest inny w Firefoksie i Chrome:

Firefox zwraca:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

Chrome zwraca:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

Jest inny 1 dzień, poprawnym wynikiem, jakiego oczekiwałbym, jest wynik z Chrome.

Kod demonstracyjny: http://jsfiddle.net/xHtqa/2/

Jak mogę rozwiązać ten problem, aby uzyskać ten sam wynik z obu?

cuongle
źródło
2
Czy to na tym samym komputerze?
Aaron Digulla
4
@Sandeep głównym punktem jest to, że Chrome dodaje przesunięcie strefy czasowej, podczas gdy Firefox nie
domyślne ustawienie regionalne
3
@CuongLe Widziałeś to pytanie: stackoverflow.com/questions/9062863/…
domyślne ustawienie regionalne
1
Jest Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}dla mnie w obu (Linux).
marekful
1
Nitpicker's corner: «Czas UTC w formacie JSON» - format JSON? Dokładniej, częstą skargą dotyczącą JSON jest to, że w ogóle nie definiuje żadnego formatu daty.
Álvaro González

Odpowiedzi:

67

Prawidłowy format czasu UTC to 2013-02-27T17:00:00Z(Z to czas Zulu). Dołącz, Zjeśli nie jest obecny, aby uzyskać poprawny ciąg daty i godziny UTC.

Petr Abdulin
źródło
2
Dzięki. To działa. Ale jest dziennik mówiący, że w przyszłości zostanie on wycofany !!!. Masz jakiś pomysł?
Débora
1
wielkie dzięki, siedzę z tym problemem od dwóch dni, ale ten post rozwiązał wszystko.
Piyal George,
30

Tak, niestety algorytmy analizujące datę są zależne od implementacji. Ze specyfikacjiDate.parse (z której korzysta new Date):

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

Aby Datekonstruktor nie (być może) używał lokalnej strefy czasowej, użyj łańcucha datetime z informacją o strefie czasowej, np "2013-02-27T17:00:00Z". Jednak trudno jest znaleźć format, który byłby niezawodny analizowany przez każdą przeglądarkę - format ISO nie jest rozpoznawany przez IE <8 (zobacz JavaScript: Które przeglądarki obsługują parsowanie ciągu daty ISO-8601 z Date.parse ). Lepiej, użyj uniksowego znacznika czasu, tj. Milisekund od epoki unixowej , lub użyj wyrażenia regularnego, aby podzielić ciąg na części, a następnie wprowadzić je do Date.UTC.

Bergi
źródło
2
Ale specyfikacja (15.9.1.15) faktycznie mówi: „Wartość przesunięcia nieobecnej strefy czasowej to„ Z ”” - więc NIE powinna zależeć od implementacji
sinelaw
12
OK, poprawka. Wygląda na błąd w specyfikacji ES5.1 - intencją było dopasowanie ISO-8601, gdzie brakujące Z oznacza czas lokalny (więc Chrome pasuje do ES5.1, Firefox i IE pasują do ISO-8601)
sinelaw
@sinelaw: Dziękujemy za dalsze zbadanie tej kwestii. Jednak niezależnie od tego, co mówi specyfikacja, [stare] przeglądarki nadal robią to inaczej :-)
Bergi
2
Dziwne użycie Date.Parse vs. new Date naprawiło problem, który miałem, polegający na tym, że Chrome konwertował datę na lokalną strefę czasową zamiast traktować ją jako już w lokalnej strefie czasowej.
KingOfHypocrites
1
@ KingOfHypocrites - to trochę dziwne, ponieważ wywołanie konstruktora Date z ciągiem znaków powinno być takie samo jak użycie Date.parse .
RobG
4

Znalazłem jedną rzecz. Wygląda na to, że natywna konsola Firefox Inspector może mieć błąd: Jeśli uruchomię „new Date ()” w natywnym Inspektorze, pokaże datę z niewłaściwą strefą czasową i ustawieniem narodowym GMT, ale uruchomię to samo polecenie w konsoli rozszerzeń Firebug, pokazany używa mojej prawidłowej strefy czasowej (GMT-3: 00).

Sergio Abreu
źródło
-2

Zauważyłem, że FireFox nie zwracał tego samego wyniku co Chrome. Wygląda na to, że format używany w kendo.toString dla daty ma znaczenie.

Ostatni wynik konsoli jest tym, czego potrzebowałem:

wprowadź opis obrazu tutaj

MJ Storm
źródło
-3

Spróbuj użyć momentu.js. Działa bardzo dobrze i podobnie ze wszystkimi przeglądarkami. zawiera wiele opcji formatowania. użyj momentu („data”). format („”) zamiast nowej daty („data”)

MSIslam
źródło