Aktualizacja 2015
To stare pytanie, ale inne nowe pytania, takie jak:
zostaną zamknięte jako duplikaty tego, więc myślę, że ważne jest, aby tutaj dodać kilka świeżych informacji. Piszę to, ponieważ przestraszyłem się, myśląc, że ludzie faktycznie kopiują i wklejają część opublikowanego tutaj kodu i używają go w produkcji.
Większość odpowiedzi tutaj albo używa skomplikowanych wyrażeń regularnych, które pasują tylko do niektórych bardzo specyficznych formatów i faktycznie robią to niepoprawnie (np. Dopasowują 32 stycznia, ale nie pasują do faktycznej daty ISO zgodnie z reklamą - zobacz demo ) lub próbują przekazać cokolwiek do Date
konstruktora i życzę wszystkiego najlepszego.
Korzystanie z momentu
Jak wyjaśniłem w tej odpowiedzi obecnie dostępna jest do tego biblioteka:
Moment.js
Jest to biblioteka do analizowania, sprawdzania poprawności, manipulowania i wyświetlania dat w JavaScript, która ma znacznie bogatszy interfejs API niż standardowe funkcje obsługi dat JavaScript.
Jest zminimalizowany / gzipowany do 12kB i działa w Node.js i innych miejscach:
bower install moment --save # bower
npm install moment --save # npm
Install-Package Moment.js # NuGet
spm install moment --save # spm
meteor add momentjs:moment # meteor
Korzystając z aplikacji Moment, możesz bardzo precyzyjnie określić poprawne daty. Czasami bardzo ważne jest dodanie wskazówek na temat oczekiwanego formatu. Na przykład data taka jak 22.06.2015 wygląda na prawidłową datę, chyba że użyjesz formatu DD / MM / RRRR, w którym to przypadku datę tę należy odrzucić jako niepoprawną. Istnieje kilka sposobów, dzięki którym możesz powiedzieć Momentowi, jakiego formatu się spodziewasz, na przykład:
moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false
true
Argument jest nie tak Moment nie będzie próbował analizować wejście jeśli nie dokładnie zgodne z jednym z formatów określonych (powinien to być domyślne zachowanie moim zdaniem).
Możesz użyć formatu dostarczonego wewnętrznie:
moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true
I możesz użyć wielu formatów jako tablicy:
var formats = [
moment.ISO_8601,
"MM/DD/YYYY :) HH*mm*ss"
];
moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true
moment("06/22/2015 :) 13*17*21", formats, true).isValid(); // true
moment("06/22/2015 :( 13*17*21", formats, true).isValid(); // false
Zobacz: DEMO .
Inne biblioteki
Jeśli nie chcesz używać Moment.js, istnieją również inne biblioteki:
Aktualizacja 2016
Stworzyłem moduł immoment , który jest jak (podzbiorem) Moment, ale bez niespodzianek spowodowanych mutacją istniejących obiektów (zobacz dokumentację więcej informacji ).
Aktualizacja 2018
Dzisiaj polecam korzystanie z Luxonu do manipulacji datą / czasem zamiast Moment, co (w przeciwieństwie do Moment) sprawia, że wszystkie obiekty są niezmienne, więc nie ma żadnych nieprzyjemnych niespodzianek związanych z ukrytą mutacją dat.
Więcej informacji
Zobacz też:
Seria artykułów Roba Gravelle'a na temat bibliotek parsujących daty JavaScript:
Dolna linia
Oczywiście każdy może próbować wyważać otwartych drzwi, napisać wyrażenie regularne (ale proszę faktycznie czytać ISO 8601 i RFC 3339, zanim to zrobić) lub wywołanie buit w konstruktorów z losowych danych do wiadomości Błąd składni jak 'Invalid Date'
(czy jesteś pewien, że ta wiadomość jest dokładnie tak samo na wszystkich platformach? We wszystkich lokalizacjach? W przyszłości?) lub możesz użyć przetestowanego rozwiązania i poświęcić swój czas na jego ulepszenie, a nie na nowo. Wszystkie wymienione tu biblioteki są wolnym oprogramowaniem typu open source.