Frage Ermitteln einer Datumsinstanz "ungültiges Datum" in JavaScript


Ich möchte den Unterschied zwischen gültigen und ungültigen Datumsobjekten in JS unterscheiden, konnte aber 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 zum Schreiben eines isValidDate Funktion?

  • Asche empfohlen Date.parse zum Analysieren von Datumszeichenfolgen, wodurch autorisierend geprüft werden kann, ob die Datumszeichenfolge gültig ist.
  • Was ich am liebsten hätte, wäre, wenn meine API eine Date-Instanz akzeptiert und prüfen könnte, ob sie gültig ist oder nicht. Borgars Lösung macht das, aber ich muss es Browser-übergreifend testen. Ich frage mich auch, ob es einen eleganteren Weg gibt.
  • Ash hat mich dazu gebracht, meine API nicht akzeptieren zu lassen Date Instanzen überhaupt, wäre dies am einfachsten zu validieren.
  • Borgar schlug vor, nach einem Test zu suchen Date Instanz und dann für das Testen Dateist der Zeitwert. Wenn das Datum ungültig ist, ist der Zeitwert NaN. Ich habe mit geprüft ECMA-262 und dieses Verhalten ist im Standard, der genau das ist, wonach ich suche.

1081
2017-08-30 11:34


Ursprung


Antworten:


So würde ich es machen:

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

Update [2018-05-31]Wenn Sie sich nicht mit Date-Objekten aus anderen JS-Kontexten (externe Fenster, Frames oder Iframes) befassen, wird diese einfachere Form möglicherweise bevorzugt:

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

885
2017-08-30 11:48



Anstatt zu verwenden new Date() du solltest benutzen:

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

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

Date.parse() gibt einen Zeitstempel zurück, eine Ganzzahl, die die Anzahl der Millisekunden seit 01 / Jan / 1970 darstellt. Es wird zurückkehren NaN wenn es die angegebene Datumszeichenfolge nicht analysieren kann.


210
2017-08-30 11:47



Sie können die Gültigkeit von a überprüfen Date Objekt d über

d instanceof Date && isFinite(d)

Um Cross-Frame-Probleme zu vermeiden, könnte man das ersetzen instanceof überprüfen mit

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

Ein Anruf an getTime() wie in Borgars Antwort ist unnötig wie isNaN() und isFinite() beide konvertieren implizit in Zahl.


88
2017-08-30 14:07



Meine Lösung besteht darin, einfach zu prüfen, ob Sie ein gültiges Datumsobjekt erhalten:

Implementierung

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

66
2017-09-11 15:03



kürzeste Antwort, um das gültige Datum zu prüfen

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

49
2017-07-04 10:10



Du kannst es einfach benutzen moment.js

Hier ist ein Beispiel:

var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false

Das Validierungsabschnitt in der Dokumentation ist ziemlich klar.

Außerdem führen die folgenden Analyseflags zu einem ungültigen Datum:

  • overflow: Ein Überlauf eines Datumsfeldes, wie zum Beispiel ein 13. Monat, ein 32. Tag des Monats (oder 29. Februar auf Nicht-Schaltjahren), ein 367. Tag des Jahres usw. Überlauf enthält den Index der ungültigen Einheit passend zu #invalidAt (siehe unten); -1 bedeutet kein Überlauf.
  • invalidMonth: Ein ungültiger Monatsname, wie beispielsweise der Moment ('März', 'MMMM'); Enthält die ungültige Monatszeichenfolge selbst oder sonst null.
  • empty: Eine Eingabezeichenfolge, die keine parsable enthält, wie Moment ('das ist Unsinn') ;. Boolesch.
  • Etc.

Quelle: http://momentjs.com/docs/


35
2017-10-14 20:18



Ich möchte erwähnen, dass das jQuery UI DatePicker-Widget über eine sehr gute Terminvalidator-Dienstprogrammmethode verfügt, die auf Format und Gültigkeit prüft (z. B. keine Datumsangaben für 01/33/2013).

Auch wenn Sie das datepicker-Widget auf Ihrer Seite nicht als UI-Element verwenden möchten, können Sie die js-Bibliothek immer zu Ihrer Seite hinzufügen und dann die Validator-Methode aufrufen und den Wert übergeben, den Sie validieren möchten. Um das Leben noch einfacher zu machen, benötigt es eine Zeichenfolge als Eingabe, kein JavaScript-Date-Objekt.

Sehen: http://api.jqueryui.com/datepicker/

Es ist nicht als eine Methode aufgeführt, aber es ist da - als eine Dienstprogrammfunktion. Durchsuchen Sie die Seite nach "parsedate" und Sie werden finden:

$ .datepicker.parseDate (Format, Wert, Einstellungen) - Extrahiert ein Datum aus einem Zeichenfolgenwert mit einem angegebenen Format.

Beispielverwendung:

var stringval = '01/03/2012';
var testdate;

try {
  testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
             // Notice 'yy' indicates a 4-digit year value
} catch (e)
{
 alert(stringval + ' is not valid.  Format must be MM/DD/YYYY ' +
       'and the date value must be valid for the calendar.';
}

(Weitere Informationen zur Angabe von Datumsformaten finden Sie unter http://api.jqueryui.com/datepicker/#utility-parseDate)

Im obigen Beispiel sehen Sie die Warnmeldung nicht, da '01 / 03/2012 'ein kalendergültiges Datum im angegebenen Format ist. Wenn Sie jedoch beispielsweise 'stringval' gleich '13 / 04/2013 'gesetzt haben, erhalten Sie die Warnmeldung, da der Wert '13 / 04/2013' nicht kalendergültig ist.

Wenn ein übergebener Zeichenfolgenwert erfolgreich analysiert wird, ist der Wert von "testdate" ein JavaScript-Date-Objekt, das den übergebenen Zeichenfolgenwert darstellt. Wenn nicht, wäre es undefiniert.


35
2018-02-15 19:30



Ich mochte Christophs Herangehensweise sehr (aber hatte nicht genug Ruf, um es zu wählen). Zu meiner Verwendung weiß ich, dass ich immer ein Date-Objekt haben werde, also habe ich das Datum einfach mit einer value () -Methode verlängert.

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

Jetzt kann ich das einfach schreiben und es ist viel deskriptiver als nur isFinite im Code zu überprüfen ...

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

22
2017-11-23 19:47



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

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 Überprüfen Sie das Datum in Javascript


15
2017-10-27 09:55



// check whether date is valid
var t = new Date('2011-07-07T11:20:00.000+00:00x');
valid = !isNaN(t.valueOf());

14
2017-07-06 21:27