2140 Stimmen

Erkennung einer Datumsinstanz mit "ungültigem Datum" in JavaScript

Ich möchte den Unterschied zwischen gültigen und ungültigen Datum Objekte in JS zu sagen, aber konnte 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 für das Schreiben eines isValidDate Funktion?

  • Esche empfohlen Date.parse für das Parsen von Datumszeichenfolgen, was eine zuverlässige Möglichkeit bietet, zu prüfen, ob die Datumszeichenfolge gültig ist.
  • Was ich bevorzugen würde, wenn möglich, ist meine API eine Date-Instanz akzeptieren und in der Lage sein, zu überprüfen/bestätigen, ob es gültig ist oder nicht. Borgars Lösung tut dies, aber ich muss es in verschiedenen Browsern testen. Ich frage mich auch, ob es einen eleganteren Weg gibt.
  • Ash hat mich dazu gebracht, zu überlegen, ob ich meine API nicht akzeptieren soll. Date Instanzen, wäre dies am einfachsten zu validieren.
  • Borgar schlug vor, einen Test auf eine Date Instanz, und dann die Prüfung auf die Date den Zeitwert. Wenn das Datum ungültig ist, ist der Zeitwert NaN . Ich habe mit ECMA-262 und dieses Verhalten ist in der Norm enthalten, was genau das ist, wonach ich suche.

1 Stimmen

Ich habe meine ursprüngliche Antwort gelöscht, da die Prüfung auf NaN eine viel bessere Lösung ist als der Vergleich mit der Zeichenfolge "Ungültiges Datum". Ich werde die isNaN-Lösung selbst verwenden müssen.

0 Stimmen

@orip, "meine API soll eine Datumsinstanz akzeptieren und prüfen/bestätigen können, ob sie gültig ist oder nicht" Haben Sie versucht: isNan(d.getTime())==true für die Datumsinstanz?

0 Stimmen

@Ash, ja - das hat Borgar auch vorgeschlagen. Ich habe in der ECMA-262-Definition der Date-Methoden nachgeschaut, und getTime gibt garantiert nicht NaN zurück. Die anderen "get*"-Methoden, wie z.B. getMonth, schon.

61voto

Steven Spungin Punkte 22085

Nachdem ich bisher alle Antworten gelesen habe, werde ich die einfachste aller Antworten geben.

Jede Lösung hier erwähnt den Aufruf date.getTime() . Dies ist jedoch nicht erforderlich, da bei der Standardkonvertierung von Datum in Zahl der Wert von getTime() verwendet wird. Ja, Ihre Typüberprüfung wird sich beschweren :) Und der OP weiß ganz klar, dass er eine Date Objekt, so dass es auch nicht notwendig ist, darauf zu testen.

Zum Test auf eine ungültig Datum:

isNaN(date)

Zum Test auf eine gültig Datum:

!isNaN(date)

0 Stimmen

Meiner Meinung nach die beste Antwort. Sollte die erste Antwort sein, die angezeigt wird

1 Stimmen

Sie können die Logik auch umkehren und die isFinite(date) - um auf ein gültiges Datum zu prüfen.

2 Stimmen

@icc97 Ich habe Ihren Vorschlag zur Lösung hinzugefügt.

57voto

Jason Foglia Punkte 2132

Ich habe einige Antworten gesehen, die diesem kleinen Ausschnitt sehr nahe kamen.

JavaScript Weg:

function isValidDate(dateObject){
    return new Date(dateObject).toString() !== 'Invalid Date';
}
console.log(isValidDate('WTH')); // -> false
console.log(isValidDate(new Date('WTH'))); // -> false
console.log(isValidDate(new Date())); // -> true

ES2015 Weg:

const isValidDate = dateObject => new Date(dateObject)
    .toString() !== 'Invalid Date';
console.log(isValidDate('WTH')); // -> false
console.log(isValidDate(new Date('WTH'))); // -> false
console.log(isValidDate(new Date())); // -> true

2 Stimmen

Bin mir nicht sicher, ob ich etwas übersehe, aber ist das zweimalige Ausführen von new Date() nicht sinnlos?

9 Stimmen

Letzteres hat nichts mit TypeScript zu tun. Es ist vollkommen gültig JS.

2 Stimmen

Die Übergabe eines beliebigen Wertes, den der Date-Konstruktor in ein gültiges Date-Objekt umwandeln kann, wird als gültiges Datum behandelt, z. B. isValidDate(0) y isValidDate(['0']) true zurückgeben.

52voto

Yves M. Punkte 28190

Sie können einfach Folgendes verwenden moment.js

Hier ist ein Beispiel:

var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false

El Validierungsbereich in der Dokumentation ist recht eindeutig.

Außerdem führen die folgenden Parsing-Flags zu einem ungültigen Datum:

  • overflow : Ein Überlauf eines Datumsfeldes, wie z.B. ein 13. Monat, ein 32. Tag des Monats (oder ein 29. Februar in Nicht-Schaltjahren), ein 367. Tag des Jahres, usw. overflow enthält den Index der ungültigen Einheit, der mit #invalidAt (siehe unten) übereinstimmt; -1 bedeutet keinen Überlauf.
  • invalidMonth : Ein ungültiger Monatsname, z. B. moment('Marbruary', 'MMMM');. Enthält den ungültigen Monatsstring selbst oder sonst null.
  • empty : Eine Eingabezeichenkette, die nichts Parsbares enthält, wie z.B. moment('das ist Unsinn');. Boolescher Wert.
  • Etc.

Quelle: http://momentjs.com/docs/

6 Stimmen

Beste Lösung, extrem einfach zu implementieren, funktioniert mit jeder Formatierung (in meinem Fall dd/MM/yyyy), kennt auch die Schaltjahre und wandelt ungültige Daten (z.B. 29/02/2015) nicht von selbst in gültige um (z.B. 30/03/2015). Um ein Datum im Format tt/MM/jjjj zu prüfen, musste ich bisher einfach Folgendes verwenden moment("11/06/1986", "DD/MM/YYYY").isValid();

6 Stimmen

Diese Verwendung von Moment ist veraltet :(

2 Stimmen

Schade. moment.js hat immer noch nicht mein Chrome-spezifisches Problem gelöst, bei dem es aus Phrasen richtige Daten errät. m = moment("bob 2015"); m.isValid(); // true

40voto

Matt Campbell Punkte 1593

Ich möchte erwähnen, dass das jQuery UI DatePicker-Widget eine sehr gute Datumsvalidierungsmethode hat, die das Format und die Gültigkeit prüft (z. B. sind keine 01/33/2013-Daten erlaubt).

Auch wenn Sie das Datepicker-Widget nicht als UI-Element auf Ihrer Seite verwenden möchten, können Sie seine .js-Bibliothek zu Ihrer Seite hinzufügen und dann die Validator-Methode aufrufen, indem Sie den zu validierenden Wert übergeben. Um das Leben noch einfacher zu machen, wird eine Zeichenkette als Eingabe akzeptiert, kein JavaScript-Datumsobjekt.

Siehe: http://api.jqueryui.com/datepicker/

Sie ist nicht als Methode aufgeführt, aber sie ist da - als Hilfsfunktion. Suchen Sie auf der Seite nach "parsedate" und Sie werden fündig:

$.datepicker.parseDate( format, value, settings ) - Extrahiert ein Datum aus einem String-Wert mit einem bestimmten Format.

Beispiel für die Verwendung:

var stringval = '01/03/2012';
var testdate;

try {
  testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
             // Notice 'yy' indicates a 4-digit year value
} catch (e)
{
 alert(stringval + ' is not valid.  Format must be MM/DD/YYYY ' +
       'and the date value must be valid for the calendar.';
}

(Weitere Informationen zur Angabe von Datumsformaten finden Sie unter http://api.jqueryui.com/datepicker/#utility-parseDate )

Im obigen Beispiel würden Sie die Warnmeldung nicht sehen, da "01/03/2012" ein kalendergültiges Datum im angegebenen Format ist. Wenn Sie jedoch "stringval" beispielsweise mit "13/04/2013" gleichsetzen, erhalten Sie die Warnmeldung, da der Wert "13/04/2013" nicht kalendergültig ist.

Wenn ein übergebener String-Wert erfolgreich geparst wird, wäre der Wert von "testdate" ein Javascript-Date-Objekt, das den übergebenen String-Wert darstellt. Wenn nicht, wäre der Wert undefiniert.

3 Stimmen

Upvote für die erste Antwort, die mit nicht englischen / lokalen Datumsformaten arbeitet.

0 Stimmen

Die vorherige Bemerkung ist falsch und irreführend. Die Date Objekt in Javascript verarbeitet das Datum in jedem Gebietsschema und vielen ISO-Formaten (und sogar einigen Nicht-ISO-Formaten, je nach Implementierung)

33voto

faridz Punkte 679
// check whether date is valid
var t = new Date('2011-07-07T11:20:00.000+00:00x');
valid = !isNaN(t.valueOf());

5 Stimmen

Es ist dasselbe @Borgar schrieb Vor 2 Jahren... Was gibt es Neues?

17 Stimmen

Es sind zwei Zeilen anstelle der hässlichen verschachtelten if-Anweisungen.

2 Stimmen

Warnung: Nullwerte gelten als gültig

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X