880 Stimmen

Wie kann man prüfen, ob ein Objekt ein Datum ist?

Ich habe einen lästigen Fehler auf einer Webseite:

date.GetMonth() ist keine Funktion

Ich vermute also, dass ich etwas falsch mache. Die Variable date ist kein Objekt des Typs Date . Wie kann ich in Javascript nach einem Datentyp suchen? Ich habe versucht, eine if (date) aber es funktioniert nicht.

function getFormatedDate(date) {
    if (date) {
       var month = date.GetMonth();
    }
}

Wenn ich also einen defensiven Code schreiben und verhindern möchte, dass das Datum (das keines ist) formatiert wird, wie kann ich das tun?

Danke!

UPDATE: Ich möchte nicht das Format des Datums überprüfen, aber ich möchte sicher sein, dass der Parameter, der an die Methode getFormatedDate() ist vom Typ Date .

0 Stimmen

Falls es auch validiert werden sollte, ob die Datum ist kein Invalid Date : stackoverflow.com/a/44198641/5846045

25voto

bdukes Punkte 144019

Wie oben erwähnt, ist es wahrscheinlich am einfachsten, vor der Verwendung der Funktion zu prüfen, ob sie existiert. Wenn es Ihnen wirklich wichtig ist, dass es sich um eine Date und nicht nur ein Objekt mit einer getMonth() Funktion, versuchen Sie dies:

function isValidDate(value) {
    var dateWrapper = new Date(value);
    return !isNaN(dateWrapper.getDate());
}

Dadurch wird entweder ein Klon des Wertes erstellt, wenn es sich um einen Date oder erstellen Sie ein ungültiges Datum. Sie können dann prüfen, ob der Wert des neuen Datums ungültig ist oder nicht.

1 Stimmen

Das hat bei mir funktioniert, danke. Allerdings, wenn Sie eine einzelne Ziffer wie 0 oder 1 übergeben, behandelt es, dass als ein gültiges Datum... irgendwelche Ideen?

0 Stimmen

Das ist richtig, @RicardoSanchez. Sie wollen wahrscheinlich die akzeptierte Antwort ( Object.prototype.toString.call(value) === '[object Date]' ), wenn es möglich ist, dass Sie Nummern bekommen. Die Methode in dieser Antwort sagt Ihnen wirklich, ob die value ist umwandelbar in eine Date .

18voto

KooiInc Punkte 111454

Für alle Typen habe ich eine Objekt-Prototyp-Funktion erstellt. Vielleicht ist sie für Sie von Nutzen

Object.prototype.typof = function(chkType){
      var inp        = String(this.constructor),
          customObj  = (inp.split(/\({1}/))[0].replace(/^\n/,'').substr(9),
          regularObj = Object.prototype.toString.apply(this),
          thisType   = regularObj.toLowerCase()
                        .match(new RegExp(customObj.toLowerCase()))
                       ? regularObj : '[object '+customObj+']';
     return chkType
            ? thisType.toLowerCase().match(chkType.toLowerCase()) 
               ? true : false
            : thisType;
}

Jetzt können Sie prüfen cualquier und zwar so:

var myDate     = new Date().toString(),
    myRealDate = new Date();
if (myRealDate.typof('Date')) { /* do things */ }
alert( myDate.typof() ); //=> String

[ März 2013 bearbeiten ] auf der Grundlage fortschreitender Erkenntnis ist dies eine bessere Methode:

Object.prototype.is = function() {
        var test = arguments.length ? [].slice.call(arguments) : null
           ,self = this.constructor;
        return test ? !!(test.filter(function(a){return a === self}).length)
               : (this.constructor.name ||
                  (String(self).match ( /^function\s*([^\s(]+)/im)
                    || [0,'ANONYMOUS_CONSTRUCTOR']) [1] );
}
// usage
var Some = function(){ /* ... */}
   ,Other = function(){ /* ... */}
   ,some = new Some;
2..is(String,Function,RegExp);        //=> false
2..is(String,Function,Number,RegExp); //=> true
'hello'.is(String);                   //=> true
'hello'.is();                         //-> String
/[a-z]/i.is();                        //-> RegExp
some.is();                            //=> 'ANONYMOUS_CONSTRUCTOR'
some.is(Other);                       //=> false
some.is(Some);                        //=> true
// note: you can't use this for NaN (NaN === Number)
(+'ab2').is(Number);                 //=> true

13voto

avalanche1 Punkte 2066

UnderscoreJS y Lodash haben eine Funktion namens .isDate() was genau das zu sein scheint, was Sie brauchen. Es lohnt sich, einen Blick auf ihre jeweiligen Implementierungen zu werfen: Lodash isDate , UnderscoreJs

13voto

jspassov Punkte 775

Der beste Weg, den ich gefunden habe, ist:

!isNaN(Date.parse("some date test"))
//
!isNaN(Date.parse("22/05/2001"))  // true
!isNaN(Date.parse("blabla"))  // false

0 Stimmen

Das klappt nicht. Ihre true-Zeile ist in Wirklichkeit falsch und die Frage bezieht sich auf die Überprüfung, ob ein Objekt ein Datumsobjekt ist...

2 Stimmen

@jspassov Antwort ist genauer mit, wenn eine Zeichenfolge ist ein Datum oder nicht. Das war es, wonach ich gesucht habe. Danke!!

1 Stimmen

Dies ist die beste Antwort für die einfache Überprüfung, ob eine Zeichenkette ein Datum ist oder nicht

8voto

itsHarshad Punkte 1249

Anstelle all dieser Workarounds können Sie Folgendes verwenden:

dateVariable = new Date(date);
if (dateVariable == 'Invalid Date') console.log('Invalid Date!');

Ich fand diesen Hack besser!

0 Stimmen

Dies funktioniert nicht, es sei denn, Sie setzen toString() nach dateVariable da ein ungültiges Datum keine Zeichenkette zurückgibt

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