Ich möchte den Unterschied zwischen gültigen und ungültigen Datumsobjekten in JS feststellen, konnte aber nicht herausfinden, wie:
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'
Irgendwelche Ideen zum Schreiben einer isValidDate
Funktion?
- Ash wird
Date.parse
zum Parsen von Datumszeichenfolgen empfohlen. Auf diese Weise können Sie überprüfen, ob die Datumszeichenfolge gültig ist. - Wenn möglich, würde ich es vorziehen, wenn meine API eine Datumsinstanz akzeptiert und prüfen / bestätigen kann, ob sie gültig ist oder nicht. Borgars Lösung macht das, aber ich muss es browserübergreifend testen. Ich frage mich auch, ob es einen eleganteren Weg gibt.
- Ash ließ mich überlegen, ob meine API überhaupt keine
Date
Instanzen akzeptieren sollte. Dies wäre am einfachsten zu überprüfen. - Borgar schlug vor, eine
Date
Instanz zu testen und dann denDate
Zeitwert der Instanz zu testen . Wenn das Datum ungültig ist, ist der ZeitwertNaN
. Ich habe mit ECMA-262 nachgefragt und dieses Verhalten ist im Standard enthalten, genau das, wonach ich suche.
javascript
date
orip
quelle
quelle
return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
Antworten:
So würde ich es machen:
Update [2018-05-31] : Wenn Sie sich nicht mit Datumsobjekten aus anderen JS-Kontexten (externen Fenstern, Frames oder Iframes) befassen, wird diese einfachere Form möglicherweise bevorzugt:
quelle
d.getTime
nurisNan(d)
d instanceof Date && !isNaN(d.getTime())
1
zum Beispiel die Ziffer analysiere, hätte ich immer noch ein gültiges Datum,Mon Jan 01 2001 00:00:00
das tatsächlich ein Datum ist, aber für den Zweck meiner Anwendung ist es völlig nutzlos . Daher ist zumindest in meinem Fall eine weitere Eingabevalidierung erforderlich. Diese Antwort bestätigt eindateObject
nicht einDate
!Anstatt zu verwenden
new Date()
, sollten Sie verwenden:Date.parse()
Gibt einen Zeitstempel zurück, eine Ganzzahl, die die Anzahl der Millisekunden seit dem 01. Januar 1970 angibt. Es wird zurückgegeben,NaN
wenn die angegebene Datumszeichenfolge nicht analysiert werden kann.quelle
Date.parse
ist implementierungsabhängig und definitiv nicht vertrauenswürdig, um allgemeine Datumszeichenfolgen zu analysieren. Es gibt kein einzelnes Format, das in gängigen Browsern korrekt analysiert wird, geschweige denn alle verwendeten (obwohl das in ES5 angegebene ISO8601-Format möglicherweise in Ordnung sein sollte).new Date('foo')
, entspricht dies im Wesentlichen derDate.parse('foo')
Methode. Siehe: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Was @RobG gesagt hat, gilt auch dafür.Sie können die Gültigkeit eines
Date
Objektsd
über überprüfenUm rahmenübergreifende Probleme zu vermeiden, könnte man die
instanceof
Prüfung durch ersetzenEin Aufruf
getTime()
wie in Borgar Antwort ist nicht notwendig , daisNaN()
undisFinite()
beide konvertieren implizit Nummer.quelle
isFinite()
ist -toString.call()
ist nur ein Ersatz für deninstanceof
Teil des SchecksisFinite
Over gibtisNaN
(beide funktionieren einwandfreiDate(Infinity)
). Wenn Sie die entgegengesetzte Bedingung wünschen, wird es außerdem etwas einfacher :if (!(date instanceof Date) || isNaN(date))
.Meine Lösung besteht darin, einfach zu überprüfen, ob Sie ein gültiges Datumsobjekt erhalten:
Implementierung
Verwendungszweck
quelle
isNaN
ist eine explizitere Möglichkeit, um NaNisNaN("a") === true
während("a" !== "a") === false
. Es lohnt sich darüber nachzudenken. +1new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)
. Wenn Sie eine Zeichenfolge an den Datumskonstruktor übergeben, müssen Sie eine standardisierte Zeichenfolge übergeben, um ein zuverlässiges Ergebnis zu erhalten. Insbesondere "Die Zeichenfolge sollte in einem Format vorliegen, das von der Date.parse () -Methode erkannt wird". developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…kürzeste Antwort, um das gültige Datum zu überprüfen
quelle
date && !isNaN(date.getTime())
date
nicht vom Typ Datum ist. Zum Beispiel :var date = 4; date && !isNaN(date.getTime());
.date instanceof Date && !isNaN(date.getTime())
Sie können einfach moment.js verwenden
Hier ist ein Beispiel:
Der Validierungsabschnitt in der Dokumentation ist ziemlich klar.
Außerdem führen die folgenden Analyseflags zu einem ungültigen Datum:
overflow
: Ein Überlauf eines Datumsfelds, z. B. ein 13. Monat, ein 32. Tag des Monats (oder ein 29. Februar bei Nicht-Schaltjahren), ein 367. Tag des Jahres usw. Überlauf enthält den Index der ungültigen Einheit um mit #invalidAt übereinzustimmen (siehe unten); -1 bedeutet kein Überlauf.invalidMonth
: Ein ungültiger Monatsname, z. B. Moment ('Marbruary', 'MMMM');. Enthält die ungültige Monatszeichenfolge selbst oder null.empty
: Eine Eingabezeichenfolge, die nichts Analysierbares enthält, wie z. B. Moment ('das ist Unsinn');. Boolescher Wert.Quelle: http://momentjs.com/docs/
quelle
moment("11/06/1986", "DD/MM/YYYY").isValid();
Ich möchte erwähnen, dass das jQuery UI DatePicker-Widget über eine sehr gute Datumsüberprüfungs-Dienstprogrammmethode verfügt, die das Format und die Gültigkeit überprüft (z. B. keine Datumsangaben vom 03.01.2013 zulässig).
Auch wenn Sie das Datepicker-Widget auf Ihrer Seite nicht als UI-Element verwenden möchten, können Sie die .js-Bibliothek jederzeit zu Ihrer Seite hinzufügen und dann die Validator-Methode aufrufen und den zu validierenden Wert übergeben. Um das Leben noch einfacher zu machen, wird eine Zeichenfolge als Eingabe verwendet, kein JavaScript-Datumsobjekt.
Siehe: http://api.jqueryui.com/datepicker/
Es ist nicht als Methode aufgeführt, aber es ist da - als Dienstprogrammfunktion. Durchsuchen Sie die Seite nach "parsedate" und Sie werden finden:
$ .datepicker.parseDate (Format, Wert, Einstellungen) - Extrahieren Sie ein Datum aus einem Zeichenfolgenwert mit einem angegebenen Format.
Anwendungsbeispiel:
(Weitere Informationen zur Angabe von Datumsformaten finden Sie unter http://api.jqueryui.com/datepicker/#utility-parseDate )
Im obigen Beispiel wird die Warnmeldung nicht angezeigt, da '01 / 03/2012 'ein kalendergültiges Datum im angegebenen Format ist. Wenn Sie beispielsweise 'stringval' gleich '13 / 04/2013 'gemacht haben, wird die Warnmeldung angezeigt, da der Wert '13 / 04/2013' nicht für den Kalender gültig ist.
Wenn ein übergebener Zeichenfolgenwert erfolgreich analysiert wurde, ist der Wert von 'testdate' ein Javascript Date-Objekt, das den übergebenen Zeichenfolgenwert darstellt. Wenn nicht, wäre es undefiniert.
quelle
Ich mochte Christophs Ansatz sehr (hatte aber nicht genug Ruf, um darüber abzustimmen). Ich weiß, dass ich immer ein Date-Objekt haben werde, also habe ich das Datum nur mit einer valid () -Methode erweitert.
Jetzt kann ich das einfach schreiben und es ist viel aussagekräftiger als nur das Überprüfen von isFinite im Code ...
quelle
isFinite
für mich perfekt funktionierenden. Aber ja, es ist sinnlos, den Prototyp zu erweitern.!isFinite
auf einenDate
Willen fangen die Tatsache, dass dasDate
istInvalid Date
. Erwähnenswert ist auch, dass sich mein Kontext in Node befindet.quelle
Mit diesem Scirpt können Sie das gültige Format von txDate.value überprüfen. Wenn es im falschen Format war, wurde das Datumsobjekt nicht instanziiert und es wurde null an dt zurückgegeben.
Und wie @ MiF's kurz vorgeschlagen hat
quelle
Ich verwende den folgenden Code, um Werte für Jahr, Monat und Datum zu validieren.
Weitere Informationen finden Sie unter Überprüfen des Datums in Javascript
quelle
str
wird nicht verwendet.Hier gibt es bereits zu viele komplizierte Antworten, aber eine einfache Zeile reicht aus (ES5):
oder sogar in ES6:
quelle
Date.parse(true)
, bekomme ich richtig eine NaN.Ich habe einige Antworten gesehen, die diesem kleinen Ausschnitt sehr nahe kamen.
JavaScript-Methode:
TypeScript-Methode:
quelle
Schöne Lösung! In meiner Bibliothek mit Hilfsfunktionen enthalten, sieht es jetzt so aus:
quelle
Das hat gerade bei mir funktioniert
Dies hat jedoch nicht funktioniert
quelle
`${new Date('foo')}` === 'Invalid Date'
Für Angular.js-Projekte können Sie Folgendes verwenden:
quelle
Keine dieser Antworten funktionierte für mich (getestet in Safari 6.0), wenn ich versuchte, ein Datum wie den 31.02.2012 zu validieren. Sie funktionieren jedoch einwandfrei, wenn ich ein Datum größer als 31 versuche.
Also musste ich ein wenig brutale Gewalt anwenden. Angenommen, das Datum hat das Format
mm/dd/yyyy
. Ich benutze @broox Antwort:quelle
&& value.split('/')[0] == (d.getMonth()+1);
new Date('string date')
ist gleichbedeutend mitDate.parse('string date')
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…, sodass Sie möglicherweise falsche wahre oder falsche Werte erhalten.Keine der oben genannten Lösungen hat bei mir funktioniert, was jedoch funktioniert hat
Der obige Code wird sehen, wenn JS den 31.02.2012 zum 02.03.2012 macht, dass er nicht gültig ist
quelle
quelle
Ich habe diese Funktion geschrieben. Übergeben Sie ihm einen String-Parameter und er bestimmt anhand dieses Formats "TT / MM / JJJJ", ob es sich um ein gültiges Datum handelt oder nicht.
Hier ist ein Test
Eingabe: "hahaha", Ausgabe: false.
Eingabe: "29/2/2000", Ausgabe: true.
Eingabe: "29/2/2001", Ausgabe: false.
quelle
Date.prototype.toISOString
wirftRangeError
(zumindest in Chromium und Firefox) auf ungültige Daten. Sie können es als Validierungsmittel verwenden und benötigen es möglicherweise nichtisValidDate
als solches (EAFP). Ansonsten ist es:quelle
Inspiriert von Borgars Ansatz habe ich sichergestellt, dass der Code nicht nur das Datum validiert, sondern auch sicherstellt, dass das Datum ein echtes Datum ist, was bedeutet, dass Daten wie der 31.09.2011 und der 29.02.2011 nicht zulässig sind.
quelle
dd/MM/yyyy
Notation verwendet. Außerdem wird es zurückgegeben,true
wenn es gültig ist.'Invalid date!'
Wenn dies nicht der Fall ist, geben Sie besser nur 1 Typ zurück.Ich habe die besten Leistungsergebnisse kombiniert, die ich bei dieser Prüfung gefunden habe, wenn ein bestimmtes Objekt:
Das Ergebnis ist folgendes:
quelle
Datumsobjekt zu Zeichenfolge ist einfacher und zuverlässiger, um festzustellen, ob beide Felder ein gültiges Datum sind. zB Wenn Sie dieses "-------" in das Datumseingabefeld eingeben. Einige der oben genannten Antworten funktionieren nicht.
quelle
Die ausgewählte Antwort ist ausgezeichnet und ich verwende sie auch. Wenn Sie jedoch nach einer Möglichkeit suchen, die Eingabe von Benutzerdaten zu überprüfen, sollten Sie sich darüber im Klaren sein, dass das Date-Objekt sehr hartnäckig ist, wenn es darum geht, scheinbar ungültige Konstruktionsargumente in gültige Argumente umzuwandeln. Der folgende Unit-Test-Code veranschaulicht den Punkt:
quelle
Nennen Sie es so
quelle
Eine fertige Funktion basierend auf der am besten bewerteten Antwort:
quelle
Einfache und elegante Lösung:
Quellen:
[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c
[2] Falsches Datum in neuem Datum () in JavaScript angezeigt
quelle
date.getDate() == day
reicht nicht aus, um festzustellen, ob das Datum gültig ist. Das ursprüngliche Datumsformat gibt in einigen Implementierungen ein ungültiges Datum zurück, unabhängig davon, ob das Datum gültig ist oder nicht. Auch "1970-01-01 00:00" gibt bei korrekter Analyse false zurück (dhBoolean(+new Date("1970-01-01"))
gibt false zurück).const date = new Date(year, month, day);
Beachten Sie, dass der Monat auf diese Weise 0 indiziert ist, sodass Sie möglicherweise einen subtrahieren müssen, um ihn korrekt auszurichten.Ich denke, einiges davon ist ein langer Prozess. Wir können es wie unten gezeigt abkürzen:
quelle
Für int 1-basierte Komponenten eines Datums:
Tests:
quelle