webentwicklung-frage-antwort-db.com.de

JavaScript erkennt gültige Daten

Mögliches Duplizieren:
Erkennen einer Datuminstanz mit ungültigem Datum in JavaScript

Ich habe folgendes verwendet, um ein gültiges Datum zu ermitteln:

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

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

Es wurde jedoch festgestellt, dass Date.parse denkt, dass die folgenden Daten gültig sind (MM/TT/JJJJ).

  • 30.2.2011 
  • 31.11.2011

Gibt es eine andere Möglichkeit, ungültige Daten zu erkennen, wenn die Anzahl der Tage die Gesamtzahl der 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:

Basierend auf den Kommentaren von @ Guffa habe ich die folgende Funktion erstellt, um Datumsangaben zu bestätigen:

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);
}
37
Nick Olsen

Um zu prüfen, ob ein Datum gültig ist, können Sie die Komponenten des Datums analysieren, ein Date-Objekt daraus erstellen und prüfen, ob die Komponenten in den Daten mit den analysierten Komponenten übereinstimmen. Wenn Sie ein Date-Objekt aus Komponenten erstellen, die außerhalb des gültigen Bereichs liegen, werden die Werte in den nächsten/vorherigen Zeitraum übertragen, um ein gültiges Datum zu erstellen.

Beispiel: new Date(2011,0,42) erstellt ein Objekt, das das Datum 2/11/2011 anstelle des Datums 1/42/2011 enthält.

Durch das Analysieren der Komponenten anstelle des vollständigen Datums werden Sie das Problem auch mit anderen Datumsformaten umgehen. Mein Browser erwartet beispielsweise ein Datumsformat wie y-m-d und nicht 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/

75
Guffa

Wenn Ihr Datumsformat auf M/D/YYYY festgelegt ist, können Sie das analysierte Datum neu formatieren und prüfen, ob es der Eingabe entspricht:

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

Das toleriert jedoch keine Leerzeichen oder Null-aufgefüllte Zahlen.

Wenn Sie die Eingaben des Benutzers nicht exakt beibehalten müssen, können Sie das Datum trotzdem neu formatieren und so tun, als wäre es das, was der Benutzer eingegeben hat.

Wenn Sie das auch nicht tun können, würde ich die Komponenten mithilfe eines RegExp selbst analysieren und dann mit den Werten der Date-Methoden vergleichen.

3
James Clark

Sie könnten ein Skript schreiben, um dies manuell auszuführen:

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 brauchen Sie auch etwas, um nach Schaltjahren Ausschau zu halten. Denken Sie jedoch daran, dass jedes durch 4 teilbare und nicht durch 100 teilbare Jahr ein Schaltjahr ist, es sei denn, die ersten beiden Ziffern des Jahres sind durch 4 teilbar. Das sollte einfach sein in diese Funktion einschließen.

Das Beispiel ist falsch

das Richtige ist

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

<= statt =

Aber das Beispiel ist großartig!

0
Thales Violakis