2011-11-11 9 views
8

Używam konstruktora daty JavaScript (ciąg) z formatem daty "rrrr-mm-dd". Konstruktor działa dobrze w IE 9 i Firefox, chyba że aplikacja działa na naszej testowej maszynie VM z uruchomionymi usługami IIS. Jeśli jest na maszynie wirtualnej, w IE 9 zwraca "NaN", ale nadal działa normalnie w Firefoksie.JavaScript Data (dataString) zwraca NaN na konkretnym serwerze i przeglądarce

var dateAsString = "2011-11-09"; 
    var dateCreated = new Date(dateAsString); 

byłem przy założeniu, że serwer nie miał nic wspólnego ze po stronie klienta JavaScript. Jakieś sugestie?

+0

Całkiem pewne, że serwer nie ma nic wspólnego z JavaScriptem po stronie klienta, ponieważ klient (osoba odwiedzająca witrynę) uruchamia ten kod, a nie serwer. – jakx

+0

@jakx Wiem, dlatego jestem tym zdezorientowany. – Gagege

+2

Sprawdź tryb dokumentu w narzędziach programistycznych IE (F12) na obu serwerach. Podejrzewam, że różnią się. – Phrogz

Odpowiedz

2

Proponuję próbę bardziej niezawodnej analizy daty. Poniższy przykład używa setFullYear(). Czy IE daje inny wynik z poniższym kodem?

/**Parses string formatted as YYYY-MM-DD to a Date object. 
    * If the supplied string does not match the format, an 
    * invalid Date (value NaN) is returned. 
    * @param {string} dateStringInRange format YYYY-MM-DD, with year in 
    * range of 0000-9999, inclusive. 
    * @return {Date} Date object representing the string. 
    */ 
    function parseISO8601(dateStringInRange) { 
    var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/, 
     date = new Date(NaN), month, 
     parts = isoExp.exec(dateStringInRange); 

    if(parts) { 
     month = +parts[2]; 
     date.setFullYear(parts[1], month - 1, parts[3]); 
     if(month != date.getMonth() + 1) { 
     date.setTime(NaN); 
     } 
    } 
    return date; 
    } 

Źródło: http://jibbering.com/faq/#parseDate

+0

To zadziałało. To nadal mnie przeraża. Serwer obsługujący JS nie powinien mieć znaczenia? Mój kod pracował w IE, kiedy uruchomiłem go na localhost. – Gagege

+0

Miałem randkę, która zawierała również czas i strefę (tylko potrzebna data). Edytowałem twoje wyrażenie na linii 2 i usunąłem z niego zarówno^jak i $. W przeciwnym razie działał jak urok. –

3

To ze względu na format daty. Z jakiegoś powodu, IE i Safari zostają potknięte z yyyy-mm-dd. Użyj innego formatu daty i powinieneś wszystko ustawić.

To mówił o tutaj:
http://biostall.com/javascript-new-date-returning-nan-in-ie-or-invalid-date-in-safari

+0

Ale prawdziwy problem polega na tym, że działa on w IE, gdy uruchamiam aplikację na moim localhost (serwer Visual Studio). To nie działa w IE, gdy jest na innym serwerze. – Gagege

+0

Czy na drugim serwerze zainstalowana jest inna wersja IE? –

+0

Nie, dwie różne karty otwarte w tym samym IE 9. Ten sam kod JS, inne zachowanie. – Gagege

8

wystarczy użyć ukośniki zamiast kresek, jeśli możesz.


EDIT: Rozszerzone wyjaśnienia ...

Standardowa ISO 8601 Format wykorzystuje łącznik jako separator daty. Moja odpowiedź nie oznacza, że ​​nie musisz przestrzegać standardów. Możesz użyć ukośników tylko dla konstruktora Date, jeśli to konieczne.

+1

To z pewnością brzmi atrakcyjnie. Czy możesz potwierdzić, że wszystkie inne główne przeglądarki obsługują także format rozdzielany przecinkami? – Wytze

+0

Tak, wszystkie z nich: http://jsfiddle.net/AwuPn/1/ –

+0

To niesamowite, dzięki! – Wytze

9

A dla tych z nas, którzy chcą wiedzieć jak wymienić łączniki (aka kreski) z ukośniki:

new Date(dashToSlash(string)); 

który wykorzystuje tę funkcję:

function dashToSlash(string){ 
    var response = string.replace(/-/g,"/"); 
    //The slash-g bit says: do this more than once 
    return response; 
} 

W moim przypadku jest to o wiele łatwiej jest konwertować myślniki na ciie selektywnie (tylko tam, gdzie jest to potrzebne dla funkcji Date()), niż zastąpienie formatu daty wszędzie w moim kodzie.

Uwaga: naprawdę konieczne jest zdefiniowanie oddzielnej zmiennej "response" i przypisanie jej wartości wyniku operacji wymiany. Jeśli tego nie zrobisz, ciąg znaków zostanie zwrócony niezmieniony w Chrome. To nie jest duży problem, ponieważ na początku Chrome nie ma problemu z łączonymi napisami daty. Ale wciąż ...

+0

'naprawdę musisz zdefiniować oddzielną zmienną 'response' i przypisać jej wartość wyniku operacji wymiany. Jeśli tego nie zrobisz, ciąg znaków zostanie zwrócony niezmieniony w Chrome. "Co? –

Powiązane problemy