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.

13voto

user1296274 Punkte 169

Das hat bei mir gerade funktioniert

new Date('foo') == 'Invalid Date'; //is true

Dies hat jedoch nicht funktioniert

new Date('foo') === 'Invalid Date'; //is false

6 Stimmen

Ich glaube, das ist browserabhängig.

0 Stimmen

@barrypicker Was meinen Sie damit, dass dies browserabhängig ist?

0 Stimmen

Das können Sie tun: `${new Date('foo')}` === 'Invalid Date'

10voto

Nick Taras Punkte 468

Für Angular.js-Projekte können Sie verwenden:

angular.isDate(myDate);

3 Stimmen

Dies gibt true zurück, wenn ein Datumsobjekt getestet wird, das mit einem ungültigen Datum initialisiert wurde.

10voto

Dex Punkte 12167

Keine dieser Antworten funktionierte bei mir (getestet in Safari 6.0), wenn ich versuchte, ein Datum wie den 31.2.2012 zu validieren. Sie funktionieren jedoch einwandfrei, wenn ich ein beliebiges Datum größer als 31 versuche.

Ich musste also ein wenig mit roher Gewalt vorgehen. Angenommen, das Datum hat das Format mm/dd/yyyy . Ich verwende die Antwort von @broox:

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

function validStringDate(value){
    var d = new Date(value);
    return d.valid() && value.split('/')[0] == (d.getMonth()+1);
}

validStringDate("2/29/2012"); // true (leap year)
validStringDate("2/29/2013"); // false
validStringDate("2/30/2012"); // false

0 Stimmen

(new Date('30.2.2014')).valid() liefert true

1 Stimmen

Es ist schon eine Weile her, dass ich diese Frage beantwortet habe, aber Sie benötigen möglicherweise beide Rückgabebedingungen, einschließlich der && value.split('/')[0] == (d.getMonth()+1);

0 Stimmen

Verwendung von new Date('string date') ist gleichbedeutend mit Date.parse('string date') , siehe: developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/ Sie können also falsche, wahre oder falsche Werte erhalten.

9voto

Dmytro Shevchenko Punkte 31263

Ich habe die folgende Lösung auf der Grundlage von Die Lösung von Borgar . In meine Bibliothek der Hilfsfunktionen aufgenommen, sieht es jetzt so aus:

Object.isDate = function(obj) {
/// <summary>
/// Determines if the passed object is an instance of Date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.prototype.toString.call(obj) === '[object Date]';
}

Object.isValidDate = function(obj) {
/// <summary>
/// Determines if the passed object is a Date object, containing an actual date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.isDate(obj) && !isNaN(obj.getTime());
}

9voto

Carsten Führmann Punkte 2570

Ich empfehle selten Bibliotheken, wenn man auch ohne sie auskommen kann. Aber in Anbetracht der Fülle der bisherigen Antworten scheint es sich zu lohnen, darauf hinzuweisen, dass die beliebte Bibliothek "date-fns" eine Funktion hat isValid . Die folgende Dokumentation stammt von ihrer Website:

isValid Argument

Vor v2.0.0

ab Version 2.0.0

neues Datum()

wahr

wahr

neues Datum('2016-01-01')

wahr

wahr

neues Datum('')

falsch

falsch

neues Datum(1488370835081)

wahr

wahr

neues Datum(NaN)

falsch

falsch

'2016-01-01'

TypeError

falsch

''

TypeError

falsch

1488370835081

TypeError

wahr

NaN

TypeError

falsch

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