Jaki jest łatwy sposób sprawdzenia, czy wartość jest prawidłową datą, dozwolony jest dowolny znany format daty.
Na przykład mam wartości 10-11-2009
, 10/11/2009
, 2009-11-10T07:00:00+0000
które powinny być uznane za wartości dat, a wartości 200
, 10
, 350
, które nie powinny być uznawane jako wartość daty. Jaki jest najprostszy sposób, aby to sprawdzić, jeśli jest to w ogóle możliwe? Ponieważ znaczniki czasu byłyby również dozwolone.
javascript
date-format
Thizzer
źródło
źródło
Odpowiedzi:
Czy
Date.parse()
wystarczy?Zobacz odpowiednią stronę dokumentacji MDN .
źródło
Date.parse("4.3")
jest986270400000
.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:
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:
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:
I możesz użyć wielu formatów jako tablicy:
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.źródło
moment("whatever 123").isValid()
zwracatrue
.moment("06/22/2015", "DD/MM/YYYY", true).isValid();
z jawnie podanym formatem oczekiwanej daty i argumentemtrue
oznaczającym ścisłe sprawdzenie. Zaktualizowałem swoją odpowiedź, dodając więcej informacji i lepsze przykłady.W ten sposób rozwiązałem ten problem w aplikacji, nad którą teraz pracuję:
zaktualizowane na podstawie opinii krillgar:
źródło
new Date(date)
nie podaje „niepoprawnej daty”.new Date(date) !== "Invalid Date"
będzie zawsze powrócić prawda od lewa wyrażenie zwróci obiekt Date z TIMEVALUE z NaN , która nigdy nie może być===
na sznurku. Używanie==
„działa” z powodu konwersji typu. Ale ponieważ parsowanie ciągów daty jest nadal w dużej mierze zależne od implementacji, polegając na tym, że parsujemy losowe formaty, które są poważnie wadliwe.isDate('Mac OS X 10.14.2')
zwraca tutaj wartość true.new Date(date) === 'Invalid Date'
działa tylko w Firefox i Chrome. IE8 (ten, który mam na moim komputerze do celów testowych) daje NaN.Jak stwierdzono w przyjętej odpowiedzi,
Date.parse(date)
zadziała również dla liczb. Aby obejść ten problem, możesz również sprawdzić, czy nie jest to liczba (jeśli to coś chcesz potwierdzić).źródło
isNan
to nie jest funkcja; niepoprawna wielkość liter w pierwszej instancji.date
takFoostreet 1
, twój stan jest oceniany jako prawdziwy.Co powiesz na coś takiego? Sprawdza, czy jest to obiekt Date, czy ciąg daty:
Powinienem wspomnieć, że to nie sprawdza ciągów sformatowanych w ISO, ale przy odrobinie pracy w RegExp powinieneś być dobry.
źródło
Żadna z odpowiedzi tutaj nie dotyczy sprawdzania, czy data jest nieprawidłowa, na przykład 31 lutego. Ta funkcja rozwiązuje ten problem, sprawdzając, czy zwrócony miesiąc jest równoważny z oryginalnym miesiącem i upewniając się, że podano prawidłowy rok.
źródło
Użyj wyrażenia regularnego, aby je zweryfikować.
źródło
Odnosząc się do wszystkich powyższych komentarzy, doszedłem do rozwiązania.
Działa to, jeśli
Date
przekazany jest w formacie ISO lub trzeba manipulować w przypadku innych formatów.Możesz grać tutaj na JSFiddle.
źródło
YYYY-MM-DD
, więc dołączenieT00:00:00.000Z
tego rozwiązania i sprawdzenie poprawności ciągów jest proste .Oto ulepszona funkcja, która używa tylko
Date.parse()
:Uwaga: Date.parse () przeanalizuje liczby: na przykład
Date.parse(1)
zwróci datę. Sprawdzamy więc, czys
nie jest to liczba, czy jest to data.źródło
Zrobiłbym to
Graj tutaj
źródło
EXAMPLE STRING 12345
i zwraca on „Ważna data”.Oto minimalistyczna wersja.
źródło
isDate(" 1")
Ta funkcja na żądanie działa idealnie, zwraca wartość true dla prawidłowej daty. Pamiętaj, aby zadzwonić, używając daty w formacie ISO (rrrr-mm-dd lub rrrr / mm / dd):
źródło
return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
Wiem, że to stare pytanie, ale stanąłem przed tym samym problemem i zauważyłem, że żadna z odpowiedzi nie zadziałała prawidłowo - konkretnie wycięto liczby (12003445 itd.) Z dat, co jest pierwotnym pytaniem. Oto dość niekonwencjonalna metoda, o której mogłem pomyśleć i wydaje się, że działa. Proszę wskazać, czy istnieją przypadki, w których się nie powiedzie.
To jest linia do usunięcia liczb. Zatem cała funkcja może wyglądać następująco:
źródło
console.log("hello 1 ", isDate("hello 1 "));
zwraca wartość trueczy można sprawdzić, czy funkcja związana z datą jest dostępna dla obiektu w celu ustalenia, czy jest to obiekt Data, czy nie?
lubić
źródło
Tak właśnie to robię. Nie obejmie to wszystkich formatów. Musisz odpowiednio dostosować. Mam kontrolę nad formatem, więc działa dla mnie
źródło
Ok, to stare pytanie, ale znalazłem inne rozwiązanie, sprawdzając je tutaj. Dla mnie działa sprawdzenie, czy funkcja getTime () jest obecna w obiekcie date:
źródło
Lekka biblioteka jest gotowa dla Ciebie: Day.js
źródło
Domyślnie jest ustawiona na PRAWDA. Zatem nawet ciągi w niewłaściwym formacie zwracają dobre wartości.
Użyłem czegoś takiego:
źródło
Spróbuj tego:
źródło