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.

1839voto

Borgar Punkte 35923

Ich würde es folgendermaßen machen:

if (Object.prototype.toString.call(d) === "[object Date]") {
  // it is a date
  if (isNaN(d)) { // d.getTime() or d.valueOf() will also work
    // date object is not valid
  } else {
    // date object is valid
  }
} else {
  // not a date object
}

Update [2018-05-31] : Wenn Sie nicht mit Datumsobjekten aus anderen JS-Kontexten (externe Windows, Frames oder Iframes) zu tun haben, ist diese einfachere Form möglicherweise vorzuziehen:

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}

Update [2021-02-01] : Bitte beachten Sie, dass es einen grundlegenden Unterschied zwischen "ungültigen Daten" ( 2013-13-32 ) und "ungültiges Datum Objekte " ( new Date('foo') ). Diese Antwort nicht sich mit der Validierung von Datumseingaben befassen, nur wenn eine Date-Instanz gültig ist.

26 Stimmen

Instanz von Brüchen über Rahmen hinweg. Duck-Typing kann auch gut funktionieren: validDate == d && d.getTime && !isNaN(d.getTime()); -- Da die Frage für eine allgemeine Utility-Funktion ist, ziehe ich es vor, strenger zu sein.

1 Stimmen

@Borgar, ich verstehe nicht, warum instanceof über Frames hinweg bricht. Auf welche Art von "Rahmen" beziehen Sie sich? Und wie stabil ist die Zeichenfolge "[Objekt Datum]"?

13 Stimmen

@Borgar, habe gerade meine Antwort gefunden: "Die Probleme entstehen, wenn es um Skripte in Multi-Frame-DOM-Umgebungen geht. Kurz gesagt, Array-Objekte, die in einem iframe erstellt werden, teilen sich keine [[Prototype]]s mit Arrays, die in einem anderen iframe erstellt werden. Ihre Konstruktoren sind unterschiedliche Objekte, so dass sowohl instanceof- als auch Konstruktorprüfungen fehlschlagen."

361voto

Ash Punkte 58914

Anstelle der Verwendung von new Date() sollten Sie verwenden:

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse() gibt einen Zeitstempel zurück, eine ganze Zahl, die die Anzahl der Millisekunden seit 01/Jan/1970 angibt. Es wird zurückgegeben NaN wenn es die übergebene Datumszeichenfolge nicht analysieren kann.

204 Stimmen

-Ich weiß nicht, warum das so viele positive Stimmen hat, Date.parse ist implementierungsabhängig und definitiv nicht dazu geeignet, allgemeine Datumszeichenfolgen zu analysieren. Es gibt kein einziges Format, das von den gängigen Browsern korrekt geparst wird, geschweige denn von allen verwendeten Formaten (obwohl das ISO8601-Format in ES5 spezifiziert sollte in Ordnung sein).

4 Stimmen

Wenn Sie die new Date('foo') das im Grunde gleichwertig ist mit dem Date.parse('foo') Methode. Siehe: developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/ Was @RobG sagte, gilt also auch für sie.

7 Stimmen

Dieser Test würde in Chrome fehlschlagen. Date.parse('AAA-0001') in Chrome liefert mir zum Beispiel eine Zahl.

129voto

abhirathore2006 Punkte 2993

Kürzeste Antwort zur Überprüfung des gültigen Datums

if(!isNaN(date.getTime()))

7 Stimmen

Das einzige Problem ist, wenn Datum nicht vom Typ Datum ist; Sie erhalten einen JS-Fehler.

0 Stimmen

@Andrew Sie müssen das Datumsobjekt erstellen, und wenn Sie bereits ein Objekt haben, verwenden Sie date && !isNaN(date.getTime())

0 Stimmen

Das gibt Ihnen immer noch einen JS-Fehler, wenn date nicht vom Typ Datum ist. Zum Beispiel: var date = 4; date && !isNaN(date.getTime()); .

127voto

Christoph Punkte 157217

Sie können die Gültigkeit einer Date Objekt d über

d instanceof Date && isFinite(d)

Um rahmenübergreifende Probleme zu vermeiden, könnte man die instanceof prüfen mit

Object.prototype.toString.call(d) === '[object Date]'

Ein Aufruf zur getTime() wie in Antwort von Borgar ist unnötig, da isNaN() y isFinite() werden beide implizit in Zahlen umgewandelt.

0 Stimmen

Versuchen Sie dies in Chrome - Object.prototype.toString.call(new Date("2013-07-09T19:07:9Z")). Es wird "[Objekt Datum]" zurückgeben. Ihrer Meinung nach sollte also "2013-07-09T19:07:9Z" ein gültiges Datum sein. Ist es aber nicht. Sie können dies in Chrome überprüfen, indem Sie var dateStr = new Date("2013-07-09T19:07:9Z"); dateStr Es wird ein ungültiges Datum zurückgeben.

2 Stimmen

@Tintin: das ist es, was isFinite() ist für - toString.call() ist nur ein Ersatz für die instanceof Teil der Prüfung

0 Stimmen

Funktioniert der Vergleich mit '[Objekt Datum]' auch in nicht-englischen Browsern? Ich bezweifle es.

104voto

Ash Clarke Punkte 4671

Meine Lösung ist für einfach überprüfen, ob Sie ein gültiges Datum Objekt erhalten:

Umsetzung

Date.prototype.isValid = function () {
    // An invalid date object returns NaN for getTime() and NaN is the only
    // object not strictly equal to itself.
    return this.getTime() === this.getTime();
};  

Verwendung

var d = new Date("lol");

console.log(d.isValid()); // false

d = new Date("2012/09/11");

console.log(d.isValid()); // true

41 Stimmen

isNaN ist ein expliziterer Weg, um auf NaN zu testen

1 Stimmen

Und doch findet man immer wieder Leute, die ihre eigenen Versionen schreiben :) documentcloud.github.com/underscore/docs/

4 Stimmen

Da ich underscore.js respektiere, hat mich das zu einigen Nachforschungen veranlasst. isNaN("a") === true , während ("a" !== "a") === false . Es lohnt sich, darüber nachzudenken. +1

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