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 leDate
's de la valeur temps. Si la date n'est pas valide, la valeur de temps estNaN
. 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.
Vous devez vous connecter pour publier un commentaire.
Voici comment j'allais le faire:
Mise à jour [2018-05-31]: Si vous n'êtes pas concerné par la Date d'objets à partir d'autres JS contextes externe (fenêtres, cadres, ou des iframes), cette forme plus simple peut être préféré:
d.getTime
justeisNan(d)
d instanceof Date && !isNaN(d.getTime())
Object.prototype.toString.call(d) === '[object Date]' && !Number.isNaN(d.getTime()
. Renvoie true si est une date valide, false sinon.return d instanceof Date && !isNaN(d.getTime());
?1
par exemple, j'aurais encore une date valide résultant deMon Jan 01 2001 00:00:00
qui est en effet une date, mais pour le but de ma candidature, c'est complètement inutile. Ainsi, il y a une entrée de validation nécessaire dans mon cas au moins. Cette réponse valide undateObject
pas unDate
!+
dans votre formule finale:function isValidDate(d) { return d instanceof Date && !isNaN(+d); }
Argument of type 'Date' is not assignable to parameter of type 'number'
. Comment pouvez-vous tester une instance de Date pour ne pas être un numéro lors de la fonction isNaN() s'attend à un nombre, mais vous le savez déjà c'est un objet Date?isValidDate(new Date('something that is a string with a version that seems a date like: 7.8.10'))
retournetrue
!isNaN(d.getTime());
Au lieu d'utiliser
new Date()
vous devez utiliser:Date.parse()
retourne un timestamp, un entier représentant le nombre de millisecondes écoulées depuis le 01/Jan/1970. Il sera de retourNaN
si il ne peut pas analyser la date fournie chaîne.Date.parse
est dépendant de l'implémentation, et certainement pas à être approuvé pour analyser général date de chaînes. Il n'y a pas de format unique qui est analysée correctement dans les navigateurs populaires, beaucoup moins de tous ceux en cours d'utilisation (bien que finalement le format ISO8601 spécifié dans l'ES5 devrait être ok).new Date('foo')
c'est en gros l'équivalent avec laDate.parse('foo')
méthode. Voir: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... Donc, ce que @RobG dit, elle s'applique aussi à elle.Vous pouvez vérifier la validité d'un
Date
objetd
viaPour éviter de la croix-formuler des questions, on pourrait remplacer le
instanceof
vérifier avecUn appel à
getTime()
comme dans Borgar réponse est inutile, carisNaN()
etisFinite()
implicitement convertir en nombre.isFinite()
est pour -toString.call()
est seulement un remplacement pour leinstanceof
le cadre de la vérificationisFinite
surisNaN
(les deux fonctionnent très bien avecDate(Infinity)
). En outre, si vous voulez la condition contraire, il devient un peu plus simple:if (!(date instanceof Date) || isNaN(date))
.Ma solution est tout simplement pour vérifier si vous obtenez une date valide de l'objet:
Mise en œuvre
Utilisation
isNaN
est un plus explicite pour tester NaNisNaN("a") === true
, tandis que("a" !== "a") === false
. Il vaut la peine d'y penser. +1new Date(null)
value
(c'est à direnew Date(value)
) est une chaîne de caractères, l'analysevalue
comme une date comme parDate.parse()
. Si elle n'est pas une chaîne, il le fait d'une contrainte d'un Nombre. Lorsque vous contraindrenull
ou""
pour un certain nombre, vous obtenez0
. Lorsque vous nenew Date(0)
vous obtenez une Date valide objet qui représente l'époque Unix. Vous pouvez éviter cela en emballage de laisValid
appel avec uneif (date) {
condition, ou tout simplementdate && date.isValid()
.new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)
. Si vous êtes de passage dans une chaîne de caractères à la date de constructeur, vous devez passer dans un format standardisé de la chaîne pour obtenir un résultat fiable. Plus précisément, "La chaîne doit être dans un format reconnu par la Date.méthode parse ()". developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...isNaN()
est en effet mieux icid.getTime() === d.getTime()
etisNaN(d.getTime())
d'aboutir au même résultat, toujours. Donc, avecisNaN
des gens qui lisent ce code pourrait penser qu'un cas particulier est le cas de manipulation, ce qui n'a pas l'air fou. Les gens auraient un moment difficile, même pour faire une recherche google sur l'approche de la comparaison. Vous avez décidé d'utiliser félicite de donner aux gens un indice. Je préfère de code explicite.plus courte réponse pour vérifier la date de validité
date && !isNaN(date.getTime())
date
n'est pas de type Date. Par exemple:var date = 4; date && !isNaN(date.getTime());
.date instanceof Date && !isNaN(date.getTime())
Thu Oct 30 9006 00:00:00 GMT+0000 (Greenwich Mean Time)
que la date?var date = new Date(str)
, alors cette réponse devrait être le plus court et le plus approprié.Vous pouvez simplement utiliser moment.js
Voici un exemple:
La la validation de la section dans la documentation est très claire.
Et aussi, à la suite de l'analyse des drapeaux résultat à une date non valide:
overflow
: Un débordement d'un champ de date, comme un 13ème mois, une 32e jour du mois (ou un 29 février pour les années non bissextiles), un 367e jour de l'année, etc. débordement contient l'index de l'invalide unité de match #invalidAt (voir ci-dessous); -1 signifie pas de débordement.invalidMonth
: Un invalide le nom du mois, comme le moment('Marbruary', 'MMMM');. Contient les invalides chaîne de mois, ou la valeur null.empty
: Une entrée de chaîne qui ne contient rien d'être analysée, comme le moment('ceci est un non-sens');. Boolean.Source: http://momentjs.com/docs/
moment("11/06/1986", "DD/MM/YYYY").isValid();
Date
est dans le “non valide” état ou pas, pas de savoir si ou non nous pouvons utilisermoment
’s de constructeur par défaut implicitement appelDate
s’constructeur.isValid()
n'est pas obsolète, n'a pas d'importance ;-).moment('Decimal128', 'YYYY-MM-DD').isValid() // true
Doit être fausse.Tiens à mentionner que le jQuery UI DatePicker widget a une très bonne date validateur méthode utilitaire qui vérifie le format et la validité (par exemple, pas de 01/33/2013 dates de permis).
Même si vous ne souhaitez pas utiliser le composant sur votre page comme un élément de l'INTERFACE utilisateur, vous pouvez toujours ajouter son .bibliothèque js pour votre page et ensuite appeler le responsable de la validation de la méthode, en passant la valeur que vous souhaitez valider en elle. Pour rendre la vie encore plus facile, il prend une chaîne de caractères en entrée, pas un objet Date JavaScript.
Voir: http://api.jqueryui.com/datepicker/
Il n'est pas répertoriée comme une méthode, mais il est là, comme une fonction d'utilité. De recherche de la page pour "parsedate" et vous trouverez:
$.datepicker.parseDate( format, la valeur des paramètres ) - Extrait d'une date à partir d'une chaîne de valeur avec un format spécifié.
Exemple d'utilisation:
(Plus d'infos re spécification des formats de date est trouvé à la http://api.jqueryui.com/datepicker/#utility-parseDate)
Dans l'exemple ci-dessus, vous ne pouvez pas voir le message d'alerte depuis 01/03/2012' est un calendrier-date valide dans le format spécifié. Toutefois, si vous avez fait 'stringval" égal "13/04/2013", par exemple), vous obtenez le message d'alerte, puisque la valeur '13/04/2013' est pas d'un calendrier valide.
Si dans le passé-dans la chaîne de valeur est analysée avec succès, la valeur de 'testdate" serait un Javascript Date objet représentant le passé-dans la chaîne de valeur. Si non, ce serait pas défini.
J'ai vraiment aimé Christoph approche (mais je n'avais pas assez d'une réputation de voter en haut).
Pour mon utilisation, je sais que j'aurai toujours un objet Date, donc j'ai juste prolongé date valide() la méthode.
Maintenant, je peux juste écrire ça et c'est beaucoup plus descriptive que la simple vérification isFinite dans le code...
J'utilise le code suivant pour valider les valeurs pour l'année, le mois et la date.
Pour plus de détails, reportez-vous à La date de vérification en javascript
str
n'est pas utilisé.Trop compliqué de réponses ici, déjà, mais d'une simple ligne suffit (ES5):
ou même dans l'ES6 :
Date.parse(true)
, j'correctement obtenir un NaN.vous pouvez vérifier le format valide de txDate.valeur avec cette scirpt. si elle était dans un format incorrect à la Date obejct pas instanciées et retourner la valeur null à dt .
Et comme @MiF proposé en court chemin
Solution sympa! Inclus dans ma bibliothèque de fonctions auxiliaires, maintenant il ressemble à ceci:
Pour Angular.js des projets que vous pouvez utiliser:
Ce juste travaillé pour moi
Toutefois, cela ne fonctionne pas
Aucune de ces réponses a fonctionné pour moi (testé dans Safari 6.0) lorsque vous essayez de valider une date comme 2/31/2012, cependant, qu'ils fonctionnent très bien quelle que soit la date de plus de 31.
J'ai donc eu de brute forcer un peu. En supposant que la date est au format
mm/dd/yyyy
. Je suis à l'aide de @broox réponse:&& value.split('/')[0] == (d.getMonth()+1);
new Date('string date')
, est l'équivalent deDate.parse('string date')
, voir: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... de sorte que vous pourriez obtenir de fausses valeurs true ou false.Aucune des deux solutions n'a fonctionné pour moi ce n'travail est cependant
le code ci-dessus va voir quand JS fait 02/31/2012 en 03/02/2012 que ce n'est pas valable
J'ai écrit cette fonction. Passer un paramètre de chaîne et il permettra de déterminer si c'est une date valide ou non en fonction de ce format "jj/MM/aaaa".
voici un test
d'entrée: "hahaha",sortie: faux.
d'entrée: "29/2/2000",sortie: vrai.
d'entrée: "29/2/2001",sortie: faux.
Inspiré par Borgar de l'approche que j'ai fait en sorte que le code non valide uniquement la date, mais en fait, permet de s'assurer que la date est une date réelle, ce qui signifie que les dates comme 31/09/2011 et 29/02/2011 ne sont pas autorisés.
dd/MM/yyyy
notation. Aussi, il retournetrue
quand il est valide &'Invalid date!'
si ce n'est pas le meilleur rendement de type 1 seulement.J'ai combiné les meilleurs résultats de performance, j'ai trouvé autour de que de vérifier si un objet donné:
Le résultat est le suivant:
Objet Date de chaîne est plus simple et fiable pour détecter si les deux champs sont valides à la date.
par exemple, Si vous entrez dans ce "-------" à la date d'entrée. Certaines des réponses ci-dessus ne fonctionne pas.
vous pouvez convertir votre date et l'heure en millisecondes getTime()
ce
getTime()
de retour de Méthode n'est Pas un NombreNaN
lorsqu'il n'est pas valide!isNaN(new Date("2/30/2012").getTime())
retourne trueLa réponse sélectionnée est excellent, et je suis de l'utiliser. Toutefois, si vous êtes à la recherche d'un moyen de validation de l'utilisateur date d'entrée, vous devez être conscient que l'objet Date est très persistant au sujet de faire de ce qui peut apparaître comme non valide construction arguments en étant valide. L'appareil de test de code illustre le point:
L'appeler comme cela
Un prêt de la fonction basée sur le top rated réponse:
Je pense que c'est un long processus. Nous pouvons couper court comme indiqué ci-dessous:
Pour int 1-composants à base d'une date:
Tests:
En général, je collerais avec quelle que soit la Date de l'implantation, c'est dans le navigateur de la pile. Ce qui signifie que vous obtiendrez toujours la "Date non Valide" lors de l'appel de toDateString() dans Chrome, Firefox, Safari de la présente réponse de la date du jour.
Je n'ai pas tester cela dans IE bien.
Donc j'ai aimé @Demander Clarke réponse avec peu d'amélioration par l'ajout d'essayer bloc catch pour les dates qui ne peuvent pas passer à travers var d = new Date(d) -
Date.prototype.toISOString
jetteRangeError
(au moins dans Chrome et Firefox) sur des dates non valides. Vous pouvez l'utiliser comme un moyen de validation et ne peuvent pas besoinisValidDate
en tant que tel (l'aeap). Sinon c'est:J'en ai vu quelques réponses qui est venu près de ce petit extrait.
Façon JavaScript:
Tapuscrit façon:
Solution Simple et élégante:
sources:
[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c
[2] Date incorrecte à new Date() en JavaScript
Cette saveur de isValidDate utilise une expression régulière qui gère les années bissextiles:
https://gist.github.com/dustinpoissant/b83750d8671f10c414b346b16e290ecf
date.parse(valueToBeTested) > 0
est tout ce qui est nécessaire. Une date de validité sera de retour à l'époque de valeur et une valeur non valide sera de retour NaN qui ne> 0
test par la vertu de n'être même pas un numéro.C'est aussi simple que d'une fonction d'assistance de ne pas enregistrer le code si cela peut être un peu plus lisible. Si vous voulais un:
OU
À utiliser:
return Data.parse( this );
àreturn !Number.isNaN(Data.parse(this));
Cette fonction valide une chaîne de caractères date en chiffres formats délimitées par un caractère, par exemple, jj/mm/aaaa, mm/jj/aaaa
Exemple d'appel:
Encore une autre façon de vérifier si la date est une date valide de l'objet:
Envisager d'utiliser moment.js si vous êtes déjà familier avec son utilisation. Il fournit une méthode isValid() qui renvoie la valeur false pour les dates non valides.
Référence: https://momentjscom.readthedocs.io/en/latest/moment/01-parsing/15-is-valid/