Dlaczego Date.parse podaje nieprawidłowe wyniki?


345

Przypadek pierwszy:

new Date(Date.parse("Jul 8, 2005"));

Wynik:

Pt 08 lipca 2005 00:00:00 GMT-0700 (PST)

Przypadek drugi:

new Date(Date.parse("2005-07-08"));

Wynik:

Czw lip 07 2005 17:00:00 GMT-0700 (PST)


Dlaczego druga analiza jest nieprawidłowa?


30
Druga analiza jest per se niepoprawna, po prostu pierwsza jest analizowana w czasie lokalnym, a druga w UTC. Pamiętaj, że „czw 07 lipca 2005 17:00:00 GMT-0700 (PST)” to to samo co „2005-07-08 00:00”.
skacze


18

1
Na wypadek, gdyby ktoś przybył tutaj, aby dowiedzieć się, dlaczego data wraca NaNw Firefoksie, odkryłem, że większość innych przeglądarek (i Node.js) analizuje datę bez dnia, np. „Kwiecień 2014” jako 1 kwietnia 2014, ale Firefox zwraca NaN. Musisz podać właściwą datę.
Jazzy

Aby dodać do powyższego komentarza Jasona: Jeśli otrzymujesz NaN w Firefoksie, innym problemem może być to, że Firefox i Safari nie lubią dzielonych dat. Tylko Chrome działa. Zamiast tego użyj ukośnika.
Bangkokian,

Odpowiedzi:


451

Do czasu pojawienia się specyfikacji piątej edycji Date.parsemetoda była całkowicie zależna od implementacji (co new Date(string)jest równoważne z Date.parse(string)wyjątkiem tego, że ta ostatnia zwraca liczbę zamiast a Date). W specyfikacji piątej edycji dodano wymóg obsługi uproszczonej (i nieco niepoprawnej) normy ISO-8601 (zobacz także: Jakie są prawidłowe ciągi daty i godziny w JavaScript? ). Ale poza tym, nie było żadnego wymogu co Date.parse/ new Date(string)należy przyjąć inny niż musieli zaakceptować cokolwiek Date#toStringwyjściowy (nie mówiąc, co to było).

Począwszy od ECMAScript 2017 (wydanie 8), implementacje były wymagane do parsowania ich danych wyjściowych Date#toStringi Date#toUTCString, ale format tych ciągów nie został określony.

Od ECMAScript 2019 (wydanie 9) format Date#toStringi Date#toUTCStringzostały określone jako (odpowiednio):

  1. ddd MMM DD RRRR GG: mm: ss ZZ [(nazwa strefy czasowej)]
    np. wt. 10 lipca 2018 18:39:58 GMT + 0530 (IST)
  2. ddd, DD MMM RRRR GG: mm: ss Z
    np. Wt 10 lipca 2018 13:09:58 GMT

udostępnienie 2 dodatkowych formatów, które Date.parsepowinny być analizowane niezawodnie w nowych implementacjach (zauważając, że obsługa nie jest wszechobecna i implementacje niezgodne będą przez pewien czas używane).

Zalecałbym, aby ciągi daty były analizowane ręcznie, a konstruktor daty był używany z argumentami roku, miesiąca i dnia, aby uniknąć dwuznaczności:

// parse a date in yyyy-mm-dd format
function parseDate(input) {

  let parts = input.split('-');

  // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based
}

Doskonałe, musiałem użyć tego jako Date.parsenie zachowywała się z brytyjskich formatów daty z jakiegoś powodu nie mogłem wypracować
Ben

1
Części czasu są udokumentowane w kodzie @CMS. Użyłem tego kodu w formacie daty „2012-01-31 12:00:00” return new Date(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);Działa idealnie, dzięki!
Richard Rout

1
@CMS, co masz na myśli przez zależne od implementacji ?
Royi Namir

3
@RoyiNamir, oznacza to, że wyniki zależą od tego, która przeglądarka internetowa (lub inna implementacja JavaScript) uruchamia Twój kod.
Samuel Edwin Ward

1
Mam również problem z nową datą (ciągiem) w różnych przeglądarkach, które zachowują się inaczej. Nie jest to nawet kwestia zepsucia w starych wersjach IE, różne przeglądarki po prostu nie są spójne. Nigdy nie używaj Date.parse ani nowej daty (ciągu).
Hoffmann

195

Podczas ostatnich doświadczeń, pisząc tłumacza JS, dużo zmagałem się z wewnętrznym funkcjonowaniem dat ECMA / JS. Więc myślę, że wrzucę tutaj moje 2 centy. Mamy nadzieję, że udostępnienie tych informacji pomoże innym w razie jakichkolwiek pytań dotyczących różnic między przeglądarkami w zakresie sposobu obchodzenia się z datami.

Strona wejściowa

Wszystkie implementacje przechowują swoje wartości daty wewnętrznie jako liczby 64-bitowe, które reprezentują liczbę milisekund (ms) od 1970-01-01 UTC (GMT to to samo, co UTC). Ta data to epoka ECMAScript, która jest również używana przez inne języki, takie jak systemy Java i POSIX, takie jak UNIX. Daty występujące po epoce są liczbami dodatnimi, a wcześniejsze daty są ujemne.

Poniższy kod jest interpretowany jako ta sama data we wszystkich bieżących przeglądarkach, ale z przesunięciem lokalnej strefy czasowej:

Date.parse('1/1/1970'); // 1 January, 1970

W mojej strefie czasowej (EST, która wynosi -05: 00), wynik to 18000000, ponieważ tyle ms jest w ciągu 5 godzin (to tylko 4 godziny w miesiącach letnich). Wartość będzie inna w różnych strefach czasowych. To zachowanie jest określone w ECMA-262, więc wszystkie przeglądarki robią to w ten sam sposób.

Chociaż istnieją pewne różnice w formatach ciągów wejściowych, które główne przeglądarki będą analizować jako daty, zasadniczo interpretują je tak samo, jeśli chodzi o strefy czasowe i czas letni, nawet jeśli parsowanie jest w dużej mierze zależne od implementacji.

Jednak format ISO 8601 jest inny. Jest to jeden z dwóch formatów opisanych w ECMAScript 2015 (ed. 6), który musi zostać przeanalizowany w ten sam sposób przez wszystkie implementacje (drugi to format określony dla Date.prototype.toString ).

Ale nawet w przypadku ciągów formatu ISO 8601 niektóre implementacje źle to rozumieją. Oto wynik porównania przeglądarki Chrome i Firefox, gdy ta odpowiedź została pierwotnie napisana dla okresu 1/1/1970 (epoki) na moim komputerze przy użyciu ciągów formatu ISO 8601, które powinny zostać sparsowane do dokładnie tej samej wartości we wszystkich implementacjach:

Date.parse('1970-01-01T00:00:00Z');       // Chrome: 0         FF: 0
Date.parse('1970-01-01T00:00:00-0500');   // Chrome: 18000000  FF: 18000000
Date.parse('1970-01-01T00:00:00');        // Chrome: 0         FF: 18000000
  • W pierwszym przypadku specyfikator „Z” wskazuje, że dane wejściowe są w czasie UTC, więc nie są przesunięte w stosunku do epoki, a wynik wynosi 0
  • W drugim przypadku specyfikator „-0500” wskazuje, że dane wejściowe są w GMT-05: 00 i obie przeglądarki interpretują dane wejściowe w strefie czasowej -05: 00. Oznacza to, że wartość UTC jest przesunięta w stosunku do epoki, co oznacza dodanie 18000000 ms do wewnętrznej wartości czasu daty.
  • Trzeci przypadek, w którym nie ma specyfikatora, powinien być traktowany jako lokalny dla systemu hosta. FF poprawnie traktuje dane wejściowe jako czas lokalny, podczas gdy Chrome traktuje je jako czas UTC, więc generuje różne wartości czasu. Dla mnie tworzy to 5-godzinną różnicę w przechowywanej wartości, co jest problematyczne. Inne systemy z różnymi przesunięciami uzyskają różne wyniki.

Ta różnica została naprawiona od 2020 r., Ale istnieją inne dziwactwa między przeglądarkami podczas analizowania ciągów formatu ISO 8601.

Ale robi się coraz gorzej. Dziwactwo ECMA-262 polega na tym, że format wyłącznie daty ISO (RRRR-MM-DD) musi być analizowany jako UTC, podczas gdy ISO 8601 wymaga, aby był analizowany jako lokalny. Oto dane wyjściowe z FF z długim i krótkim formatem daty ISO bez specyfikatora strefy czasowej.

Date.parse('1970-01-01T00:00:00');       // 18000000
Date.parse('1970-01-01');                // 0

Tak więc pierwszy jest analizowany jako lokalny, ponieważ jest to data i godzina ISO 8601 bez strefy czasowej, a drugi jest analizowany jako UTC, ponieważ jest to tylko data ISO 8601.

Tak więc, aby bezpośrednio odpowiedzieć na pierwotne pytanie, "YYYY-MM-DD"ECMA-262 musi być interpretowana jako UTC, podczas gdy drugie jest interpretowane jako lokalne. Dlatego:

To nie daje równoważnych wyników:

console.log(new Date(Date.parse("Jul 8, 2005")).toString()); // Local
console.log(new Date(Date.parse("2005-07-08")).toString());  // UTC

To robi:

console.log(new Date(Date.parse("Jul 8, 2005")).toString());
console.log(new Date(Date.parse("2005-07-08T00:00:00")).toString());

Najważniejsze jest to, aby parsować ciągi dat. TYLKO ciąg ISO 8601, który można bezpiecznie analizować w różnych przeglądarkach, to długi formularz z przesunięciem (± GG: mm lub „Z”). Jeśli to zrobisz, możesz bezpiecznie przechodzić między godzinami lokalnymi i UTC.

Działa to w różnych przeglądarkach (po IE9):

console.log(new Date(Date.parse("2005-07-08T00:00:00Z")).toString());

Większość obecnych przeglądarek równo traktuje inne formaty wejściowe, w tym często używane „1/1/1970” (M / D / RRRR) i „1/1/1970 00:00:00 AM” (M / D / RRRR hh : mm: ss ap) formaty. Wszystkie poniższe formaty (oprócz ostatniego) są traktowane jako dane czasu lokalnego we wszystkich przeglądarkach. Wyjście tego kodu jest takie samo we wszystkich przeglądarkach w mojej strefie czasowej. Ostatni jest traktowany jako -05: 00 niezależnie od strefy czasowej hosta, ponieważ przesunięcie jest ustawione na znaczniku czasu:

console.log(Date.parse("1/1/1970"));
console.log(Date.parse("1/1/1970 12:00:00 AM"));
console.log(Date.parse("Thu Jan 01 1970"));
console.log(Date.parse("Thu Jan 01 1970 00:00:00"));
console.log(Date.parse("Thu Jan 01 1970 00:00:00 GMT-0500"));

Ponieważ jednak parsowanie nawet formatów określonych w ECMA-262 nie jest spójne, zaleca się, aby nigdy nie polegać na wbudowanym analizatorze składni i zawsze ręcznie analizować ciągi, na przykład za pomocą biblioteki i przekazać format do analizatora składni.

Np. W momencie.js możesz napisać:

let m = moment('1/1/1970', 'M/D/YYYY'); 

Strona wyjściowa

Po stronie wyjściowej wszystkie przeglądarki tłumaczą strefy czasowe w ten sam sposób, ale inaczej obsługują formaty ciągów. Oto toStringfunkcje i dane wyjściowe. Zwróć uwagę na wyjście funkcji toUTCStringi toISOString5:00 AM na moim komputerze. Ponadto nazwa strefy czasowej może być skrótem i może być różna w różnych implementacjach.

Konwertuje czas UTC na czas lokalny przed wydrukowaniem

 - toString
 - toDateString
 - toTimeString
 - toLocaleString
 - toLocaleDateString
 - toLocaleTimeString

Drukuje bezpośrednio zapisany czas UTC

 - toUTCString
 - toISOString 

W Chrome
toString            Thu Jan 01 1970 00:00:00 GMT-05:00 (Eastern Standard Time)
toDateString        Thu Jan 01 1970
toTimeString        00:00:00 GMT-05:00 (Eastern Standard Time)
toLocaleString      1/1/1970 12:00:00 AM
toLocaleDateString  1/1/1970
toLocaleTimeString  00:00:00 AM

toUTCString         Thu, 01 Jan 1970 05:00:00 GMT
toISOString         1970-01-01T05:00:00.000Z

W przeglądarce Firefox
toString            Thu Jan 01 1970 00:00:00 GMT-05:00 (Eastern Standard Time)
toDateString        Thu Jan 01 1970
toTimeString        00:00:00 GMT-0500 (Eastern Standard Time)
toLocaleString      Thursday, January 01, 1970 12:00:00 AM
toLocaleDateString  Thursday, January 01, 1970
toLocaleTimeString  12:00:00 AM

toUTCString         Thu, 01 Jan 1970 05:00:00 GMT
toISOString         1970-01-01T05:00:00.000Z

Zwykle nie używam formatu ISO do wprowadzania tekstu. Używanie tego formatu jest dla mnie jedyne, kiedy daty muszą być sortowane jako ciągi. Format ISO można sortować w obecnym stanie, podczas gdy inne nie. Jeśli musisz mieć zgodność z różnymi przeglądarkami, określ strefę czasową lub użyj zgodnego formatu ciągu.

Kod new Date('12/4/2013').toString()przechodzi następującą wewnętrzną pseudo-transformację:

  "12/4/2013" -> toUCT -> [storage] -> toLocal -> print "12/4/2013"

Mam nadzieję, że ta odpowiedź była pomocna.


3
Po pierwsze, jest to fantastyczny napis. Chciałem jednak wskazać zależność. W odniesieniu do specyfikatorów strefy czasowej stwierdziłeś: „Brak specyfikatora powinien zakładać wprowadzanie czasu lokalnego”. Na szczęście standard ECMA-262 eliminuje wszelką potrzebę domniemania. Stwierdza : „Wartość nieobecnego przesunięcia strefy czasowej wynosi„ Z ”.” Tak więc łańcuch daty / godziny bez określonej strefy czasowej jest traktowany jako czas UTC, a nie czas lokalny. Oczywiście, podobnie jak w przypadku wielu rzeczy JavaScript, wydaje się, że istnieje niewielka zgodność między implementacjami.
Daniel

2
... w tym najczęściej używane formaty „1/1/1970” i „1/1/1970 00:00:00 AM”. - najczęściej używany gdzie ? Na pewno nie ma tego w moim kraju.
ulidtko

2
@ulidtko - Przepraszam, jestem w USA. Wow ... jesteś tam w Kijowie. Mam nadzieję, że ty i twoja rodzina będziecie bezpieczni i że wkrótce tam wszystko się ustabilizuje. Zadbaj o siebie i powodzenia we wszystkim.
drankin2112

Tylko uwaga tutaj. Wygląda na to, że nie działa to w przeglądarkach Safari (tj. IOS lub OSX). To lub mam jakiś inny problem.
keyneom

1
@ Daniel - na szczęście autorzy ECMAScript naprawili swój błąd związany z brakującą strefą czasową dla reprezentacji daty i godziny. Teraz ciągi daty i godziny bez strefy czasowej używają przesunięcia strefy czasowej hosta (tj. „Lokalne”). Myląco, formularze tylko z datą ISO 8601 są traktowane jako UTC (chociaż nie jest to szczególnie jasne w specyfikacji), podczas gdy ISO 8601 traktuje je jako lokalne, więc nie naprawiły wszystkiego.
RobG

70

W szaleństwie jest jakaś metoda. Zasadniczo, jeśli przeglądarka może interpretować datę jako ISO-8601, zrobi to. „2005-07-08” wpada do tego obozu i dlatego jest analizowany jako UTC. „8 lipca 2005 r.” Nie może, dlatego jest analizowany w czasie lokalnym.

Zobacz JavaScript i daty, co za bałagan! po więcej.


3
Zasadniczo, jeśli przeglądarka może interpretować datę jako ISO-8601, zrobi to. Nie jest obsługiwana. „2020-03-20 13:30:30” jest traktowany przez wiele przeglądarek jako ISO 8601 i lokalny, ale przez Safari niepoprawna data. Istnieje wiele formatów ISO 8601, które nie są obsługiwane przez większość przeglądarek, np. 2004-W53-7 i 2020-092.
RobG

7

Innym rozwiązaniem jest zbudowanie tablicy asocjacyjnej z formatem daty, a następnie sformatowanie danych.

Ta metoda jest przydatna w przypadku daty sformatowanej w nietypowy sposób.

Przykład:

    mydate='01.02.12 10:20:43':
    myformat='dd/mm/yy HH:MM:ss';


    dtsplit=mydate.split(/[\/ .:]/);
    dfsplit=myformat.split(/[\/ .:]/);

    // creates assoc array for date
    df = new Array();
    for(dc=0;dc<6;dc++) {
            df[dfsplit[dc]]=dtsplit[dc];
            }

    // uses assc array for standard mysql format
    dstring[r] = '20'+df['yy']+'-'+df['mm']+'-'+df['dd'];
    dstring[r] += ' '+df['HH']+':'+df['MM']+':'+df['ss'];

5

Użyj moment.js, aby przeanalizować daty:

var caseOne = moment("Jul 8, 2005", "MMM D, YYYY", true).toDate();
var caseTwo = moment("2005-07-08", "YYYY-MM-DD", true).toDate();

Trzeci argument określa ścisłe analizowanie (dostępne od 2.3.0). Bez tego moment.js może również dawać nieprawidłowe wyniki.


4

Zgodnie z http://blog.dygraphs.com/2012/03/javascript-and-dates-what-mess.html format „rrrr / mm / dd” rozwiązuje zwykłe problemy. Mówi: „Trzymaj się„ RRRR / MM / DD ”dla ciągów daty, gdy tylko jest to możliwe. Jest to powszechnie obsługiwane i jednoznaczne. W tym formacie wszystkie czasy są lokalne.” Ustawiłem testy: http://jsfiddle.net/jlanus/ND2Qg/432/ Ten format: + pozwala uniknąć niejednoznaczności zamówień dnia i miesiąca, używając zamawiania ymd, a 4-cyfrowy rok + pozwala uniknąć problemu UTC vs. zgodność z formatem ISO za pomocą ukośników + danvk, facet z dygraphs , mówi, że ten format jest dobry we wszystkich przeglądarkach.


Możesz zobaczyć odpowiedź autora .
Brad Koch

Powiedziałbym, że rozwiązanie z przykładem w jsFiddle działa wystarczająco dobrze, jeśli używasz jQuery, ponieważ używa on parsera datepicker. W moim przypadku problem dotyczy jqGrid, ale okazało się, że ma on swoją metodę parseDate. W każdym razie ten przykład pomógł mi, dając mi pomysł, więc +1 za to, dzięki.
Wasil Popow

2
Ten artykuł o dygraphach jest błędny, a pierwszy przykład na stronie wyraźnie pokazuje, dlaczego używanie ukośników zamiast łączników jest tak naprawdę złą radą. W momencie pisania tego artykułu użycie „2012/03/13” spowodowało, że przeglądarka parsowała go jako lokalną datę, zamiast UTC. Specyfikacja ECMAScript określa jawne wsparcie dla używania „RRRR-MM-DD” (ISO8601), dlatego zawsze używaj łączników. Należy zauważyć, że w momencie pisania tego komentarza Chrome został załatany, aby traktować ukośniki jako UTC.
Lachlan Hunt

4

Chociaż CMS ma rację, że przekazywanie ciągów do metody parsowania jest ogólnie niebezpieczne, nowa specyfikacja ECMA-262 5. edycja (znana również jako ES5) w sekcji 15.9.4.2 sugeruje, że Date.parse()faktycznie powinna obsługiwać daty sformatowane w ISO. Stara specyfikacja nie zawierała takiego twierdzenia. Oczywiście stare przeglądarki i niektóre obecne przeglądarki nadal nie zapewniają tej funkcji ES5.

Twój drugi przykład nie jest zły. Jest to określona data w UTC, jak sugeruje Date.prototype.toISOString(), ale jest reprezentowana w lokalnej strefie czasowej.


1
Analiza składni ciągów daty została ponownie zmieniona w ECMAScript 2015, tak że „2005-07-08” jest lokalny, a nie UTC. BTW, ES5 nie był standardem do czerwca 2011 r. (A obecnie jest to ECMAScript 2015). ;-)
RobG

1
Dla pomylenia rzeczy, TC39 zdecydowało w październiku (zaledwie miesiąc po moim poprzednim poście), że „2005-07-08” powinno być UTC , jednak „” 2005-07-08T00: 00: 00 "powinno być lokalne. Oba są ISO 8601 formaty zgodne, oba nie mają strefy czasowej, ale są traktowane inaczej. Idź rysunek
RobG

2

Ta lekka biblioteka analizująca datę powinna rozwiązać wszystkie podobne problemy. Podoba mi się biblioteka, ponieważ jest dość łatwa do rozszerzenia. Możliwe jest również i18n to (niezbyt proste, ale nie tak trudne).

Przykład parsowania:

var caseOne = Date.parseDate("Jul 8, 2005", "M d, Y");
var caseTwo = Date.parseDate("2005-07-08", "Y-m-d");

I formatowanie z powrotem do łańcucha (zauważysz, że oba przypadki dają dokładnie ten sam wynik):

console.log( caseOne.dateFormat("M d, Y") );
console.log( caseTwo.dateFormat("M d, Y") );
console.log( caseOne.dateFormat("Y-m-d") );
console.log( caseTwo.dateFormat("Y-m-d") );

2

Oto krótki, elastyczny fragment kodu służący do konwersji ciągu datetime w sposób bezpieczny dla różnych przeglądarek, który jest szczegółowo opisany przez @ drankin2112.

var inputTimestamp = "2014-04-29 13:00:15"; //example

var partsTimestamp = inputTimestamp.split(/[ \/:-]/g);
if(partsTimestamp.length < 6) {
    partsTimestamp = partsTimestamp.concat(['00', '00', '00'].slice(0, 6 - partsTimestamp.length));
}
//if your string-format is something like '7/02/2014'...
//use: var tstring = partsTimestamp.slice(0, 3).reverse().join('-');
var tstring = partsTimestamp.slice(0, 3).join('-');
tstring += 'T' + partsTimestamp.slice(3).join(':') + 'Z'; //configure as needed
var timestamp = Date.parse(tstring);

Twoja przeglądarka powinna zapewniać ten sam wynik znacznika czasu, co Date.parse:

(new Date(tstring)).getTime()

Proponuję dodać T do wyrażenia regularnego, aby przechwycić również daty w formacie JS: inputTimestamp.split (/ [T \ /: -] / g)
andig

Jeśli podzielisz ciąg na części składowe, najbardziej wiarygodnym następnym krokiem będzie użycie tych części jako argumentów konstruktora Date. Utworzenie kolejnego ciągu, który zostanie przekazany do analizatora składni, spowoduje powrót do kroku 1. „2014-04-29 13:00:15” powinien zostać przeanalizowany jako lokalny, a kod ponownie sformatuje go jako UTC. :-(
RobG

2

Oba są poprawne, ale są interpretowane jako daty z dwiema różnymi strefami czasowymi. Więc porównałeś jabłka i pomarańcze:

// local dates
new Date("Jul 8, 2005").toISOString()            // "2005-07-08T07:00:00.000Z"
new Date("2005-07-08T00:00-07:00").toISOString() // "2005-07-08T07:00:00.000Z"
// UTC dates
new Date("Jul 8, 2005 UTC").toISOString()        // "2005-07-08T00:00:00.000Z"
new Date("2005-07-08").toISOString()             // "2005-07-08T00:00:00.000Z"

Usunąłem Date.parse()wywołanie, ponieważ jest ono używane automatycznie w argumencie ciągu. Porównałem również daty w formacie ISO8601 , abyś mógł wizualnie porównać daty między datami lokalnymi a datami UTC. Czasy różnią się od siebie o 7 godzin, co jest różnicą w strefie czasowej i dlatego twoje testy wykazały dwie różne daty.

Innym sposobem utworzenia tych samych dat lokalnych / UTC byłoby:

new Date(2005, 7-1, 8)           // "2005-07-08T07:00:00.000Z"
new Date(Date.UTC(2005, 7-1, 8)) // "2005-07-08T00:00:00.000Z"

Ale nadal zdecydowanie polecam Moment.js, który jest tak prosty, ale potężny :

// parse string
moment("2005-07-08").format()       // "2005-07-08T00:00:00+02:00"
moment.utc("2005-07-08").format()   // "2005-07-08T00:00:00Z"
// year, month, day, etc.
moment([2005, 7-1, 8]).format()     // "2005-07-08T00:00:00+02:00"
moment.utc([2005, 7-1, 8]).format() // "2005-07-08T00:00:00Z"

0

Odpowiedź przyjmowane od CMS jest poprawne, ja po prostu dodać kilka funkcji:

  • przycinaj i oczyszczaj przestrzenie wejściowe
  • parsuj ukośniki, myślniki, dwukropki i spacje
  • ma domyślny dzień i godzinę

// parse a date time that can contains spaces, dashes, slashes, colons
function parseDate(input) {
    // trimes and remove multiple spaces and split by expected characters
    var parts = input.trim().replace(/ +(?= )/g,'').split(/[\s-\/:]/)
    // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
    return new Date(parts[0], parts[1]-1, parts[2] || 1, parts[3] || 0, parts[4] || 0, parts[5] || 0); // Note: months are 0-based
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.