La détection d'une “date invalide” instance de Date en JavaScript

Je voudrais vous dire la différence entre valides et non valides date d'objets en JS, mais je ne pouvais pas comprendre comment:

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'

Des idées pour la rédaction d'un isValidDate fonction?

  • Cendres recommandé Date.parse pour l'analyse des chaînes date, ce qui donne une autorité moyen de vérifier si la date est valide.
  • Ce que je préfère, si possible, avoir mon API accepter une instance de Date et d'être en mesure de vérifier/vérifie si elle est valide ou pas. Borgar la solution de le fait, mais j'ai besoin de le tester sur tous les navigateurs. Je me demande aussi si il y a une façon plus élégante.
  • Ash m'a fait envisager de ne pas avoir mon API accepter Date les instances à tous, ce serait plus facile à valider.
  • Borgar proposé à l'essai pour Date exemple, puis de le tester pour le Date's de la valeur temps. Si la date n'est pas valide, la valeur de temps est NaN. J'ai vérifié avec ECMA-262 et ce comportement est dans la norme, ce qui est exactement ce que je cherche.
  • J'ai supprimé ma réponse originale à cette question depuis de vérifier si NaN est une bien meilleure solution que de comparer à une chaîne "Date Invalide". Je vais avoir à faire usage de la fonction isNaN solution, moi-même.
  • mon API accepter une instance de Date et d'être en mesure de vérifier/vérifie si elle est valide ou pas" Avez-vous essayé: isNan(d.getTime())==true à la date d'instance?
  • oui - c'est ce que Borgar suggéré. J'ai regardé l'ECMA-262 définition de la Date de méthodes, et getTime n'est pas garanti de retour NaN. Les autres "se*" méthodes, telles que la méthode getMonth, sont.
  • Oups, my bad - getTime renvoie NaN juste fine (renvoie la "valeur temps", qui est NaN si la date n'est pas valide)
  • Vous pouvez supprimer l'instruction si en changeant le corps de la fonction: return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
  • certes, mais pourquoi?
  • Elle rend le code plus lisible. Le plus fi, les retours, les démunis, etc ... peuvent rendre le code plus confus. La même raison que vous ne le faites pas if (!bool == false) return false;
  • suppose que c'est un style de préférence: je trouve ça plus clair de séparer la vérification de type de l'égalité de la logique.
  • Veuillez garder à l'esprit que Date.parse dépend de la mise en œuvre, voir stackoverflow.com/questions/3085937/...
  • Pourquoi var d = new Date("30/30/44"); isValidDate(d); retourner vrai?
  • Il ne fonctionne pas avec IE8 - s'il vous Plaît voir ici stackoverflow.com/questions/13878515/...
  • IE roule c'est mois. Un mois de 30 est en fait vu que 2 ans et 6 mois. Donc 30/30/44 dans IE crée un objet date du 30 juin, 46. L'objet Date est valide si elle passe le test ci-dessus. (C'est probablement roule sur elle même les jours)
  • Donc Object.prototype.toString.call(obj) === "[object Date]" && !isNaN(obj) gagne. Cool. Cependant, le test pour une instance de Date doit être séparée de la question de savoir si elle contient une période de validité de la valeur, car ils sont deux questions distinctes.
  • J'ai senti votre modifier réduit la valeur de cette entrée. Il peut ne pas être un "pur" Q&Un format, mais il y a discours ici qui a été perdu.
  • le discours est exactement ce qui est fortement déconseillé en question. Veuillez vous référer aux méta sujets pour apprendre le raisonnement derrière elle. la Passation d'une réponse à une question dans la question elle-même est contre la politique du site. Otoh, que, de remercier pour les réponses et de les avoir "MODIFIER" dans votre réponse est typique de duvet. Si vous voulez vous top-rated question à vous identifier comme une personne qui ne sais pas de quelle que SORTE que ce est et comment l'utiliser, et ne souhaite pas apprendre qu' - être mon invité.
  • Il n'a pas été "perdu"; il est encore encombrer la question de la révision de l'histoire si vous voulez le voir de nouveau. Mais il n'appartient pas à une question. À 37k rep, vous devez le savoir.
  • Veuillez cesser de le modifier de la guerre. Les modifications sur cette question sont discutés sur meta. Veuillez ne pas modifier/rollback ce post plus loin. Si vous êtes en désaccord avec les précédentes modifications/restaurations ou des commentaires à leur sujet, merci de poster sur ce méta thread et pas ici.

InformationsquelleAutor orip | 2009-08-30