2012-11-13 11 views
28

Pracuję nad aplikacją na iOS opartą na Phonegap, która jest już zrobiona dla Androida. Poniższe linie działają dobrze na Androida, ale nie na iOS. Czemu?Data JavaScript jest nieprawidłowa na iOS

var d = new Date("2015-12-31 00:00:00"); 
console.log(d.getDate() + '. ' + d.getMonth() + ' ' + d.getFullYear(); 

Wynik dla Androida:

31.11 2015 

Wynik na iOS:

NaN. NaN NaN 

Gdzie jest różnica bierze?

Odpowiedz

65

Twój ciąg daty nie jest w formacie określonym do pracy z new Date. Jedyny format w specyfikacji to a simplified version of ISO-8601, ale został dodany tylko w ES5, więc wsparcie może być dotykowe i gotowe. Twój ciąg nie jest w tym formacie, ale jest naprawdę blisko.

przypadku zmiany miejsca do T, będziesz w ciemno:

var dateString = "2015-12-31 00:00:00"; 
var d = new Date(dateString.replace(' ', 'T')); 

(Zakładam, że nie jesteś rzeczywiście przy ciąg dosłowne, stąd połączenie replace.)

Należy zauważyć, że wystąpił błąd w specyfikacji ES5, który został poprawiony w ES2015 (ES6): Co się dzieje, gdy w ciągu znaków nie ma wskaźnika strefy czasowej. W ISO-8601 żaden wskaźnik nie oznacza "czasu lokalnego", ale specyfikacja ES5 mówi, że domyślnie jest to Z (GMT). Naprawiono to w specyfikacji ES2015, ale niestety niektóre silniki JavaScript postępowały zgodnie ze specyfikacją ES5, a inne były zgodne z normą ISO-8601 (i teraz ES2015), więc aby uzyskać solidną obsługę różnych przeglądarek, należy uwzględnić wskaźnik strefy czasowej, ponieważ w przeciwnym razie nie wiedzieć, czy będzie to interpretowane jako czas GMT lub czas lokalny. Możesz użyć Z dla GMT lub +/-, a następnie HH:MM, aby uzyskać przesunięcie. (Skróty takie jak CST są niedozwolone, ponieważ nie ma w nich standardu.)

Jeśli jeszcze tego nie potwierdzą, nawet jeśli jest to nieudokumentowane, istnieje prawie uniwersalna obsługa dla YYYY/MM/DD HH:MM:SS. Więc:

var dateString = "2015-12-31 00:00:00"; 
var d = new Date(dateString.replace(/-/g, '/')); 
+0

Cheers, T robi trick ! –

+1

@PhilippSafffried: Wspaniale, cieszę się, że pomogło! –

+1

@NULL: Nigdy nie widziałem silnika JavaScript, który go nie obsługiwał.IE6 i nowsze wersje, każda wersja Firefoksa, jaką kiedykolwiek widziałem, każda wersja Chrome, każda wersja Opery. ** Ale **, zawsze należy testować w środowiskach docelowych (bez względu na to, czy coś jest "standardowe", czy nie, niestety). –

5

Nie mogę ci powiedzieć dlaczego. Może dlatego, że iOS nie obsługuje funkcji JavaScript Date, jak również Androida, czy obsługuje inny format?

Ale mogę dać obejścia:

var s = "2015-12-31 00:00:00".split(" ")[0].split("-"), 
    d = new Date(s[0], s[1], s[2], 0, 0, 0); 

console.log(d); 

var s = "2015-12-31 00:00:00".replace(/[ :]/g, "-").split("-"), 
    d = new Date(s[0], s[1], s[2], s[3], s[4], s[5]); 

console.log(d); 
+0

będę go spróbować i dostać z powrotem do Ciebie – samouray

1

Spróbuj z var d = new Date("2015/12/31 00:00:00"); pracuje dla mnie.

-1

także

var d = new Date("2015/12/31 00:00:00"); 

pracuje dla mnie :)

Dzięki @dda

+0

Nie działa dla mnie bez zastępowania miejsca znakiem 'T' – zanderwar

Powiązane problemy