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 dieDate
den Zeitwert. Wenn das Datum ungültig ist, ist der ZeitwertNaN
. 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.
0 Stimmen
Oops, mein Fehler - getTime gibt NaN gerade fein (gibt "der Zeitwert", die NaN ist, wenn das Datum ungültig ist)
20 Stimmen
Sie könnten die if-Anweisung entfernen, indem Sie den Hauptteil der Funktion in ändern:
return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
3 Stimmen
@styfle - sicher, aber warum?
0 Stimmen
@orip Das macht den Code besser lesbar. Je mehr ifs, returns, nots usw., desto verwirrender kann der Code werden. Aus demselben Grund macht man auch keine
if (!bool == false) return false;
3 Stimmen
@styfle - ich schätze, das ist eine Stilvorliebe: Ich finde es übersichtlicher, die Typenprüfung von der Gleichheitslogik zu trennen.
0 Stimmen
Bitte bedenken Sie, dass
Date.parse
ist abhängig von der Implementierung, siehe stackoverflow.com/questions/3085937/0 Stimmen
Warum var d = new Date("30/30/44"); isValidDate(d); liefert true?
0 Stimmen
Im IE8 funktionierte es nicht - siehe hier stackoverflow.com/questions/13878515/
0 Stimmen
Der IE überschlägt sich mit seinen Monaten. Ein Monat von 30 wird als 2 Jahre und 6 Monate angesehen. 30/30/44 im IE erzeugt also ein Datumsobjekt mit dem Datum 30. Juni 46. Das Datumsobjekt ist gültig, so dass es den obigen Test besteht. (Wahrscheinlich rollt es auch über seine Tage)
0 Stimmen
Also
Object.prototype.toString.call(obj) === "[object Date]" && !isNaN(obj)
gewinnt. Prima. Der Test für eine Datumsinstanz sollte jedoch von dem Test, ob sie einen gültigen Zeitwert enthält, getrennt sein, da es sich um zwei verschiedene Anliegen handelt.0 Stimmen
Warum ist das nicht angemessen?
return d.toString() !== 'Invalid Date'
? Ich gehe davon aus, dass dieser Wert in der Spezifikation definiert ist und daher genauso zuverlässig ist wie z. B. die Werte, die vontypeof
.0 Stimmen
Warum nicht die Antwort von Tom oder
date == 'Invalid Date'
?