Chciałbym powiedzieć różnicę między prawidłowymi i nieprawidłowymi obiektami daty w JS, ale nie mogłem dowiedzieć się, jak:
var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'
Jakieś pomysły na napisanie isValidDate
funkcji?
- Ash zaleca się
Date.parse
do analizowania ciągów daty, co daje wiarygodny sposób sprawdzenia, czy ciąg daty jest prawidłowy. - Jeśli to możliwe, wolę, aby mój interfejs API zaakceptował instancję Date i mógł sprawdzić / potwierdzić, czy jest poprawna, czy nie. Rozwiązanie Borgara to robi, ale muszę to przetestować w różnych przeglądarkach. Zastanawiam się także, czy istnieje bardziej elegancki sposób.
- Ash kazał mi rozważyć, czy mój interfejs API nie akceptuje
Date
w ogóle instancji, byłoby to najłatwiejsze do sprawdzenia. - Borgar zasugerował przetestowanie
Date
instancji, a następnie przetestowanieDate
wartości czasu. Jeśli data jest nieprawidłowa, wartość czasu toNaN
. Sprawdziłem za pomocą ECMA-262 i takie zachowanie jest w standardzie, dokładnie tego szukam.
javascript
date
orip
źródło
źródło
return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
Odpowiedzi:
Oto jak bym to zrobił:
Aktualizacja [2018-05-31] : Jeśli nie interesują Cię obiekty Date z innych kontekstów JS (zewnętrzne okna, ramki lub ramki iframe), ta prostsza forma może być preferowana:
źródło
d.getTime
po prostuisNan(d)
d instanceof Date && !isNaN(d.getTime())
1
na przykład parsując cyfrę , nadal miałbym prawidłową datę,Mon Jan 01 2001 00:00:00
która faktycznie jest datą, jednak dla celów mojej aplikacji jest to całkowicie bezużyteczne . Dlatego przynajmniej w moim przypadku potrzebna jest dodatkowa weryfikacja danych wejściowych. Ta odpowiedź potwierdzadateObject
nieDate
!Zamiast używać
new Date()
należy użyć:Date.parse()
zwraca znacznik czasu, liczbę całkowitą reprezentującą liczbę milisekund od 01 / Jan / 1970. Zwróci,NaN
jeśli nie będzie mógł przeanalizować podanego ciągu daty.źródło
Date.parse
zależy od implementacji i zdecydowanie nie można ufać, że analizuje ogólne ciągi dat. W popularnych przeglądarkach nie ma jednego formatu, który zostałby poprawnie przeanalizowany, a tym bardziej wszystkich używanych (choć format ISO8601 określony w ES5 powinien być w porządku).new Date('foo')
, jest to w zasadzie równoważne z tąDate.parse('foo')
metodą. Widzieć: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… To, co powiedział @RobG, dotyczy również tego.Możesz sprawdzić ważność
Date
obiektud
za pomocąAby uniknąć problemów między ramkami, można wymienić
instanceof
czek naWezwanie do
getTime()
jak w odpowiedzi borgar jest to niepotrzebne, jakisNaN()
iisFinite()
zarówno niejawnie konwertowane na liczby.źródło
isFinite()
jest -toString.call()
to tylkoinstanceof
część czekuisFinite
ponadisNaN
(zarówno działać dobrze zDate(Infinity)
). Ponadto, jeśli chcesz warunek przeciwny, robi się nieco prostsze:if (!(date instanceof Date) || isNaN(date))
.Moje rozwiązanie polega na sprawdzeniu, czy otrzymałeś prawidłowy obiekt daty:
Realizacja
Stosowanie
źródło
isNaN
jest bardziej wyraźnym sposobem na testowanie NaNisNaN("a") === true
, podczas gdy("a" !== "a") === false
. Warto o tym pomyśleć. +1new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)
. Jeśli przekazujesz ciąg do konstruktora daty, musisz przekazać znormalizowany ciąg, aby uzyskać wiarygodny wynik. W szczególności „Łańcuch powinien mieć format rozpoznawany przez metodę Date.parse ()”. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…najkrótsza odpowiedź, aby sprawdzić prawidłową datę
źródło
date && !isNaN(date.getTime())
date
nie jest typu Data. Na przykład:var date = 4; date && !isNaN(date.getTime());
.date instanceof Date && !isNaN(date.getTime())
Możesz po prostu użyć moment.js
Oto przykład:
Sekcja walidacji w dokumentacji jest dość jasna.
Ponadto następujące flagi analizowania powodują niepoprawną datę:
overflow
: Przepełnienie pola daty, takiego jak 13. miesiąc, 32. dzień miesiąca (lub 29 lutego w latach bez przestępstwa), 367. dzień roku itp. Przepełnienie zawiera indeks nieprawidłowej jednostki dopasować #invalidAt (patrz poniżej); -1 oznacza brak przepełnienia.invalidMonth
: Niepoprawna nazwa miesiąca, taka jak moment („Marbruary”, „MMMM”) ;. Zawiera sam niepoprawny ciąg miesiąca, w przeciwnym razie null.empty
: Ciąg wejściowy, który nie zawiera niczego, co można przetwarzać, na przykład moment („to nonsens”) ;. Boolean.Źródło: http://momentjs.com/docs/
źródło
moment("11/06/1986", "DD/MM/YYYY").isValid();
Chciałbym wspomnieć, że widget jQuery UI DatePicker ma bardzo dobrą metodę narzędzia sprawdzania poprawności daty, która sprawdza format i ważność (np. Niedozwolone są daty 01/01/2013).
Nawet jeśli nie chcesz używać widżetu datepicker na swojej stronie jako elementu interfejsu użytkownika, zawsze możesz dodać jego bibliotekę .js do swojej strony, a następnie wywołać metodę sprawdzania poprawności, przekazując do niej wartość, którą chcesz sprawdzić. Aby uczynić życie jeszcze łatwiejszym, jako dane wejściowe potrzebny jest ciąg znaków, a nie obiekt Date JavaScript.
Zobacz: http://api.jqueryui.com/datepicker/
Nie ma go na liście jako metody, ale istnieje - jako funkcja narzędzia. Wyszukaj na stronie „parsowane”, a znajdziesz:
$ .datepicker.parseDate (format, wartość, ustawienia) - Wyodrębnij datę z wartości ciągu o określonym formacie.
Przykładowe użycie:
(Więcej informacji na temat określania formatów dat można znaleźć na stronie http://api.jqueryui.com/datepicker/#utility-parseDate )
W powyższym przykładzie nie zobaczysz komunikatu ostrzegawczego, ponieważ „01.03.2012” jest datą obowiązującą w kalendarzu w określonym formacie. Jeśli na przykład parametr „stringval” będzie równy „13.04.2013”, otrzymasz komunikat ostrzegawczy, ponieważ wartość „13.04.2013” nie jest ważna w kalendarzu.
Jeśli przekazana wartość ciągu zostanie pomyślnie przeanalizowana, wartością „testdate” będzie obiekt JavaScript Date reprezentujący przekazaną wartość ciągu. Jeśli nie, byłoby niezdefiniowane.
źródło
Naprawdę podobało mi się podejście Christopha (ale nie miałem dość reputacji, aby go zagłosować). Na mój użytek wiem, że zawsze będę miał obiekt Date, dlatego właśnie przedłużyłem datę za pomocą ważnej metody ().
Teraz mogę to napisać i jest to o wiele bardziej opisowe niż sprawdzanie isFinite w kodzie ...
źródło
isFinite
działał dla mnie idealnie. Ale tak, nie ma sensu przedłużać prototypu.!isFinite
naDate
złapie fakt, żeDate
jestInvalid Date
. Warto również zauważyć, że mój kontekst znajduje się w węźle.źródło
za pomocą tego skryptu możesz sprawdzić poprawny format pliku txDate.value. jeśli był niepoprawny format Data obejct nie wystąpił i zwrócił null do dt.
I jak sugeruje w skrócie @ MiF
źródło
Korzystam z następującego kodu, aby sprawdzić wartości dla roku, miesiąca i daty.
Aby uzyskać szczegółowe informacje, patrz Sprawdź datę w javascript
źródło
str
nie jest używany.Zbyt wiele skomplikowanych odpowiedzi tutaj, ale wystarczy prosta linia (ES5):
lub nawet w ES6:
źródło
Date.parse(true)
, poprawnie otrzymuję NaN.Widziałem kilka odpowiedzi, które zbliżyły się do tego małego fragmentu.
Sposób JavaScript:
Sposób TypeScript:
źródło
Fajne rozwiązanie! Zawarte w mojej bibliotece funkcji pomocniczych, teraz wygląda następująco:
źródło
To po prostu działało dla mnie
Jednak to nie zadziałało
źródło
`${new Date('foo')}` === 'Invalid Date'
Do projektów Angular.js możesz użyć:
źródło
Żadna z tych odpowiedzi nie działała dla mnie (testowana w przeglądarce Safari 6.0) podczas próby sprawdzenia poprawności daty, takiej jak 31.12.2012, jednak działają one dobrze, gdy próbuję daty większej niż 31.
Musiałem więc trochę brutalizować siłę. Zakładając, że data jest w formacie
mm/dd/yyyy
. Korzystam z odpowiedzi @ Broox:źródło
&& value.split('/')[0] == (d.getMonth()+1);
new Date('string date')
jest równoważne zDate.parse('string date')
, patrz: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/..., więc możesz otrzymać fałszywe wartości true lub false.Żadne z powyższych rozwiązań nie działało dla mnie, ale działało
powyższy kod sprawdzi, kiedy JS zamienia 31.03.2012 na 03.02.2012, że nie jest ważny
źródło
źródło
Napisałem tę funkcję. Przekaż mu parametr ciągu, który określi, czy jest to poprawna data, czy nie, na podstawie tego formatu „dd / MM / rrrr”.
tutaj jest test
input: „hahaha”, output: false.
wejście: „29/2/2000”, wyjście: prawda.
wejście: „29/2/2001”, wyjście: fałsz.
źródło
Date.prototype.toISOString
rzucaRangeError
(przynajmniej w Chromium i Firefox) w nieprawidłowe daty. Możesz użyć go jako środka sprawdzania poprawności i może nie być potrzebnyisValidDate
jako taki (EAFP). W przeciwnym razie jest to:źródło
Zainspirowany podejściem Borgara upewniłem się, że kod nie tylko potwierdza datę, ale faktycznie upewnia się, że data jest prawdziwą datą, co oznacza, że daty takie jak 31/09/2011 i 29/02/2011 są niedozwolone.
źródło
dd/MM/yyyy
notacji. Zwraca także,true
gdy jest ważny, a'Invalid date!'
jeśli nie, lepiej zwrócić tylko 1 typ.Połączyłem najlepsze wyniki wydajności, które znalazłem wokół tego sprawdzenia, czy dany obiekt:
Wynik jest następujący:
źródło
Obiekt daty na ciąg jest prostszym i niezawodnym sposobem na wykrycie, czy oba pola są poprawne. np. jeśli wpiszesz to „-------” w polu wprowadzania daty. Niektóre z powyższych odpowiedzi nie będą działać.
źródło
Wybrana odpowiedź jest doskonała i ja jej również używam. Jeśli jednak szukasz sposobu na sprawdzenie poprawności wprowadzania daty użytkownika, powinieneś mieć świadomość, że obiekt Date bardzo uporczywie przekształca argumenty konstrukcyjne w niepoprawne. Poniższy kod testu jednostkowego ilustruje ten punkt:
źródło
Nazwij to tak
źródło
Gotowa funkcja oparta na najwyżej ocenianej odpowiedzi:
źródło
Proste i eleganckie rozwiązanie:
źródła:
[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c
[2] Niepoprawna data podana w nowej dacie () w JavaScript
źródło
date.getDate() == day
jest niewystarczający do ustalenia, czy data jest ważna. Oryginalny format daty zwróci nieprawidłową datę w niektórych implementacjach, niezależnie od tego, czy data jest poprawna, czy nie. Również „1970-01-01 00:00”, jeśli poprawnie przeanalizowane, zwróci false (tj.Boolean(+new Date("1970-01-01"))
Zwróci false).const date = new Date(year, month, day);
Uwaga: miesiąc jest w ten sposób indeksowany jako 0, więc może być konieczne odjęcie jednego, aby poprawnie wyrównać.Myślę, że część tego jest długim procesem. Możemy to skrócić, jak pokazano poniżej:
źródło
W przypadku elementów daty opartych na int 1:
Testy:
źródło