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.

27voto

broox Punkte 2820

Der Ansatz von Christoph hat mir sehr gut gefallen (aber ich hatte nicht genug Ansehen, um ihn zu wählen). Für meine Verwendung weiß ich, dass ich immer ein Date-Objekt haben werde, also habe ich date einfach mit einer valid()-Methode erweitert.

Date.prototype.valid = function() {
  return isFinite(this);
}

Jetzt kann ich dies einfach schreiben und es ist viel anschaulicher als die Überprüfung von isFinite im Code...

d = new Date(userDate);
if (d.valid()) { /* do stuff */ }

21 Stimmen

Erweitern des Prototyps? Das ist ein großes JavaScript nein nein!

0 Stimmen

Upvoting wegen der isFinite hat bei mir perfekt funktioniert. Aber ja, es ist sinnlos, den Prototyp zu erweitern. !isFinite in einem Date wird die Tatsache, dass die Date es Invalid Date . Auch erwähnenswert mein Kontext ist innerhalb Node.

0 Stimmen

Ich habe keine Ahnung, warum einige vorschlagen isFinite über isNaN da isFinite liefert true für einen größeren Zahlenbereich (- < d < +) als ein Date-Objekt verarbeiten kann (-8.64e15 < d < +8.64e15) und ein Date-Objekt mit einem Zeitwert von NaN soll ausdrücklich ein ungültiges Datum darstellen. !isNaN(date) ist semantischer, genauer und weniger aufwendig zu tippen.

23voto

Jingguo Yao Punkte 6278

Ich verwende den folgenden Code, um die Werte für Jahr, Monat und Datum zu überprüfen.

function createDate(year, month, _date) {
  var d = new Date(year, month, _date);
  if (d.getFullYear() != year 
    || d.getMonth() != month
    || d.getDate() != _date) {
    throw "invalid date";
  }
  return d;
}

Einzelheiten finden Sie unter Datum in Javascript prüfen

0 Stimmen

str nicht verwendet wird.

0 Stimmen

Ok, das ist genial und soweit ich sehen kann, die beste und einzige Möglichkeit, ein beschissenes Datum wie "31. Februar 1970" zu validieren. Ich wünschte, ich könnte 10 Upvotes geben.

0 Stimmen

Link ist jetzt defekt

19voto

Yuseferi Punkte 6592

Sie können das gültige Format von txDate.value mit diesem Scirpt überprüfen. Wenn es im falschen Format war, wird das Datum nicht instanziert und null an dt zurückgegeben.

 var dt = new Date(txtDate.value)
 if (isNaN(dt))

Und wie @MiF in Kurzform vorgeschlagen hat

 if(isNaN(new Date(...)))

0 Stimmen

Es gibt ein Problem - !isNan(new Date(123)) dies ist auch zurückgeben true

0 Stimmen

@AbhishekTomar verwenden Sie die erste. gibt sie true?

0 Stimmen

Beide sind gleich, nur der Schreibstil ist anders.

16voto

Vijay Jagdale Punkte 1907

Warum schreibe ich eine 48. Antwort, nachdem es schon so viele vor mir versucht haben? Die meisten Antworten sind teilweise richtig und werden nicht in jeder Situation funktionieren, während andere unnötig langatmig und komplex sind. Nachfolgend finden Sie eine sehr prägnante Lösung. Damit wird geprüft, ob es sich um Date Typs und prüfen Sie dann, ob es sich um ein gültiges Datumsobjekt handelt:

return x instanceof Date && !!x.getDate();

Nun zum Parsen von Datumstext: Die meisten Lösungen verwenden Date.parse(), oder "new Date()" -- beide werden in bestimmten Situationen versagen und können gefährlich sein . JavaScript parst eine Vielzahl von Formaten und ist auch von der Lokalisierung abhängig. Zum Beispiel werden Zeichenfolgen wie "1" und "blah-123" als gültiges Datum geparst.

Dann gibt es Beiträge, die entweder eine Tonne Code oder ein kilometerlanges RegEx verwenden oder Frameworks von Drittanbietern einsetzen.

Dies ist eine einfache Methode zur Validierung einer Datumszeichenfolge.

function isDate(txt) {
   var matches = txt.match(/^\d?\d\/(\d?\d)\/\d{4}$/); //Note: "Day" in the RegEx is parenthesized
   return !!matches && !!Date.parse(txt) && new Date(txt).getDate()==matches[1];
}

TEST THE FUNCTION
<br /><br />
<input id="dt" value = "12/21/2020">
<input type="button" value="validate" id="btnAction" onclick="document.getElementById('rslt').innerText = isDate(document.getElementById('dt').value)"> 
<br /><br />
Result: <span id="rslt"></span>

Die erste Zeile von isDate analysiert den Eingabetext mit einem einfachen RegEx, um die Datumsformate mm/dd/yyyy oder m/d/yyyy zu überprüfen. Für andere Formate müssen Sie den RegEx entsprechend ändern, z.B. für dd-mm-yyyy wird der RegEx /^(\d?\d)-\d?\d-\d{4}$/

Wenn das Parsen fehlschlägt, ist "matches" null, ansonsten wird der Tag des Monats gespeichert. Die zweite Zeile führt weitere Tests durch, um sicherzustellen, dass es sich um ein gültiges Datum handelt, und schließt Fälle wie den 31.9.2021 aus (den JavaScript zulässt). Beachten Sie schließlich, dass der Doppelhieb (!!) "falsy" in ein boolesches false umwandelt.

4 Stimmen

Hier steht, dass der 31.9.2021 und der 29.2.2021 gültige Daten sind, aber das stimmt nicht.

2 Stimmen

Gutes Argument, Rokit! Javascript Datum ist freizügig und erlaubt höhere (oder niedrigere) Zahlen und behandelt höhere Monatstage in den folgenden Monat (s). So wird "2/29/2021" als 01. März 2021 berechnet. Ich habe die Funktion aktualisiert, um dieses Problem zu beseitigen, und sie prüft jetzt den Min-/Max-Bereich einschließlich Schaltjahr.

15voto

Sebastien H. Punkte 6010

Hier gibt es schon zu viele komplizierte Antworten, aber eine einfache Zeile reicht aus (ES5):

Date.prototype.isValid = function (d) { return !isNaN(Date.parse(d)) } ;

oder sogar in ES6 :

Date.prototype.isValid = d => !isNaN(Date.parse(d));

1 Stimmen

Aus MDN: "Die Methode Date.parse() analysiert eine String-Repräsentation eines Datums und gibt die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 UTC oder NaN zurück..." Wenn Sie also ein mögliches Datum durch diese Funktion laufen lassen, erhalten Sie entweder eine ganze Zahl oder NaN. Dann gibt die Funktion isNaN() einen sauberen Booleschen Wert aus, der Ihnen sagt, ob der ursprüngliche Wert ein gültiges Datumsobjekt war oder nicht. Dies reicht für eine stichprobenartige Überprüfung aus, aber im obigen Beispiel wird diese Methode an das Date-Objekt angehängt, damit die Funktionalität im gesamten Programm leicht verfügbar und lesbar ist.

0 Stimmen

Wenn d boolesch ist, erhalten Sie 0 oder 1, dass not ein Nan ist!!

0 Stimmen

@davcup gerade getestet mit Date.parse(true) erhalte ich korrekt ein NaN.

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