38 Stimmen

JavaScript zur Erkennung gültiger Daten

Mögliches Duplikat:
Erkennung einer Datumsinstanz mit "ungültigem Datum" in JavaScript

Ich habe das Folgende verwendet, um ein gültiges Datum zu erkennen:

var text = $('#Date').val();
var date = Date.parse(text);

if (isNaN(date)) {
      // Invalid date
}

Ich habe jedoch festgestellt, dass Date.parse die folgenden Datumsangaben für gültig hält (mm/dd/yyyy)

  • 2/30/2011
  • 11/31/2011

Gibt es eine andere Möglichkeit, ungültige Daten zu erkennen, wenn die Anzahl der Tage die Gesamtzahl der Tage übersteigt? Tage im Monat überschreitet?

UPDATE: Ein noch größeres Problem ist, dass das jQuery-Validierungs-Plugin dies auch nicht als ungültiges Datum erkennt!

LÖSUNG:

Auf der Grundlage der Kommentare von @Guffa habe ich die folgende Funktion zur Validierung von Daten erstellt:

function validDate(text) {

    var date = Date.parse(text);

    if (isNaN(date)) {
        return false;
    }

    var comp = text.split('/');

    if (comp.length !== 3) {
        return false;
    }

    var m = parseInt(comp[0], 10);
    var d = parseInt(comp[1], 10);
    var y = parseInt(comp[2], 10);
    var date = new Date(y, m - 1, d);
    return (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d);
}

3 Stimmen

Date.parse glaubt nicht, dass sie korrekt sind, aber es wandelt sie für Sie in korrekte Daten um. Z.B.. 2/30/2011 wird enden als 03/02/2011

1 Stimmen

Nachdem ich für die Schließung als Duplikat gestimmt habe, habe ich festgestellt, dass die gestellte Frage lautet no identisch, obwohl es verwandt ist.

1 Stimmen

Da ich Eingaben in mehreren Sprachumgebungen unterstützen musste, haben wir einen eigenen Datums-Parser implementiert. Die einzige Möglichkeit, diesen Fehler zu erkennen, bestand darin, den von uns geparsten Monatsstring mit dem Monat zu vergleichen, der aus dem generierten Datum stammt

76voto

Guffa Punkte 663241

Um zu prüfen, ob ein Datum gültig ist, können Sie die Komponenten des Datums analysieren, eine Date Objekt und prüft, ob die Komponenten in den Daten mit den geparsten Komponenten übereinstimmen. Wenn Sie ein Date Objekts aus Komponenten, die außerhalb des Bereichs liegen, fließen die Werte in den nächsten/vorherigen Zeitraum über, um ein gültiges Datum zu erstellen.

Zum Beispiel, new Date(2011,0,42) wird ein Objekt erstellt, das das Datum 2/11/2011 statt 1/42/2011 enthält.

Indem Sie die Komponenten anstelle des vollständigen Datums analysieren, umgehen Sie auch das Problem mit unterschiedlichen Datumsformaten. Mein Browser erwartet zum Beispiel ein Datumsformat wie y-m-d statt d/m/y .

Beispiel:

var text = '2/30/2011';
var comp = text.split('/');
var m = parseInt(comp[0], 10);
var d = parseInt(comp[1], 10);
var y = parseInt(comp[2], 10);
var date = new Date(y,m-1,d);
if (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d) {
  alert('Valid date');
} else {
  alert('Invalid date');
}

Demo: http://jsfiddle.net/Guffa/UeQAK/

3voto

James Clark Punkte 1757

Wenn Ihr Datumsformat festgelegt ist als M/D/YYYY können Sie das geparste Datum neu formatieren und sehen, ob es mit der Eingabe übereinstimmt:

var d = new Date(Date.parse(str))
return str === (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear();

Allerdings werden dabei keine Leerzeichen oder mit Nullen aufgefüllte Zahlen toleriert.

Wenn Sie die Eingaben des Benutzers nicht exakt beibehalten müssen, können Sie das Datum einfach umformatieren und so tun, als ob der Benutzer es eingegeben hätte.

Aber wenn Sie auch das nicht können, würde ich die Komponenten selbst mit einem RegExp analysieren und sie dann mit Werten aus der Date Methoden.

0voto

Sie könnten ein Skript schreiben, um dies manuell zu tun:

function checkDate(day, month) {
   if ((month == 4 || month == 6 || month == 9 || month == 11) && day < 30) {
       alert("Date is valid")
   }
   else if (month == 2 && day <= 28) {
       alert("Date is valid")
   }
   else if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day <= 31) {
       alert("Date is valid")
   }
   else {
       alert("Date is in-valid")
   }
}

Natürlich bräuchte man auch etwas, um Schaltjahre zu erkennen, aber denken Sie daran, dass jedes Jahr, das durch 4 und nicht durch 100 teilbar ist, ein Schaltjahr ist, es sei denn, die ersten beiden Ziffern des Jahres sind durch 4 teilbar. Das sollte leicht in diese Funktion einzubeziehen sein.

0voto

Das Beispiel ist falsch

das Richtige ist

if ((month == 4 || month == 6 || month == 9 || month == 11) && day <= 30)

<= anstelle von =

Aber das Beispiel ist großartig!

0voto

Madhur Trivedi Punkte 33

Eine einfache, immanente Möglichkeit, dies zu erreichen, kann sein:

let dateObj = document.getElementById('Date');
if (dateObj.validity.badInput) {
 // show error message
}

Jetzt können einige Datumsformatierungen vorgenommen werden, aber das HTML-Ereignis date-picker hat Eigenschaften wie badInput und valid, um ungültige Daten zu prüfen.

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