Je voudrais faire la différence entre les objets de date valides et invalides dans JS, mais je n'ai pas pu 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 écrire une isValidDate
fonction?
- Ash est recommandé
Date.parse
pour l'analyse des chaînes de date, ce qui permet de vérifier si la chaîne de date est valide. - Ce que je préférerais, si possible, c'est que mon API accepte une instance de Date et puisse vérifier / affirmer si elle est valide ou non. La solution de Borgar le fait, mais je dois la tester sur tous les navigateurs. Je me demande également s'il existe une manière plus élégante.
- Ash m'a fait envisager de ne pas avoir du tout d'acceptation d'
Date
instances par mon API , ce serait plus facile à valider. - Borgar a suggéré de tester une
Date
instance, puis de tester laDate
valeur de temps de. Si la date n'est pas valide, la valeur d'heure estNaN
. J'ai vérifié avec ECMA-262 et ce comportement est dans la norme, c'est exactement ce que je recherche.
javascript
date
orip
la source
la source
return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
Réponses:
Voici comment je le ferais:
Mise à jour [31/05/2018] : Si vous n'êtes pas concerné par les objets Date d'autres contextes JS (fenêtres externes, cadres ou iframes), cette forme plus simple peut être préférée:
la source
d.getTime
justeisNan(d)
d instanceof Date && !isNaN(d.getTime())
1
par exemple, j'aurais toujours une date valide résultantMon Jan 01 2001 00:00:00
qui est en effet une date, mais pour les besoins de ma candidature, elle est complètement inutile . Ainsi, il y a un peu plus de validation d'entrée nécessaire dans mon cas au moins. Cette réponse valide undateObject
pas unDate
!Au lieu d'utiliser,
new Date()
vous devez utiliser:Date.parse()
renvoie un horodatage, un entier représentant le nombre de millisecondes depuis 01 / Jan / 1970. Il retourneraNaN
s'il ne peut pas analyser la chaîne de date fournie.la source
Date.parse
dépend de la mise en œuvre et n'est certainement pas fiable pour analyser les chaînes de date générales. Il n'y a pas de format unique qui soit correctement analysé dans les navigateurs populaires, encore moins tous ceux utilisés (bien que finalement le format ISO8601 spécifié dans ES5 devrait être correct).new Date('foo')
c'est fondamentalement équivalent à laDate.parse('foo')
méthode. Voir: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Donc ce que @RobG a dit, cela s'applique également à lui.Vous pouvez vérifier la validité d'un
Date
objetd
viaPour éviter les problèmes de cross-frame, on pourrait remplacer le
instanceof
chèque parUn appel à
getTime()
comme dans la réponse de Borgar est inutile carisNaN()
et à laisFinite()
fois convertir implicitement nombre.la source
isFinite()
-toString.call()
n'est qu'un remplacement pour lainstanceof
partie du chèqueisFinite
overisNaN
(les deux fonctionnent très bien avecDate(Infinity)
). En outre, si vous voulez la condition d' en face, il devient un peu plus simple:if (!(date instanceof Date) || isNaN(date))
.Ma solution consiste à vérifier simplement si vous obtenez un objet date valide:
la mise en oeuvre
Usage
la source
isNaN
est un moyen plus explicite de tester NaNisNaN("a") === true
, tandis que("a" !== "a") === false
. Cela vaut la peine d'y penser. +1new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)
. Si vous passez une chaîne au constructeur de date, vous devez passer une chaîne standardisée pour obtenir un résultat fiable. Plus précisément, «La chaîne doit être dans un format reconnu par la méthode Date.parse ()». developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…réponse la plus courte pour vérifier la date de validité
la source
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())
Vous pouvez simplement utiliser moment.js
Voici un exemple:
La section de validation de la documentation est assez claire.
Et aussi, les indicateurs d'analyse suivants entraînent une date non valide:
overflow
: Un débordement d'un champ de date, tel qu'un 13e mois, un 32e jour du mois (ou le 29 février les années non bissextiles), un 367e jour de l'année, etc. le débordement contient l'index de l'unité non valide pour correspondre à #invalidAt (voir ci-dessous); -1 signifie pas de débordement.invalidMonth
: Un nom de mois non valide, tel que moment ('Marbruary', 'MMMM') ;. Contient la chaîne de mois non valide elle-même, ou bien null.empty
: Une chaîne d'entrée qui ne contient rien d'analysable, comme moment ('c'est absurde') ;. Booléen.Source: http://momentjs.com/docs/
la source
moment("11/06/1986", "DD/MM/YYYY").isValid();
Je voudrais mentionner que le widget jQuery UI DatePicker a une très bonne méthode utilitaire de validation de date qui vérifie le format et la validité (par exemple, aucune date 01/33/2013 n'est autorisée).
Même si vous ne souhaitez pas utiliser le widget datepicker sur votre page en tant qu'élément d'interface utilisateur, vous pouvez toujours ajouter sa bibliothèque .js à votre page, puis appeler la méthode validator, en lui transmettant la valeur que vous souhaitez valider. Pour rendre la vie encore plus facile, il faut une chaîne en entrée, pas un objet Date JavaScript.
Voir: http://api.jqueryui.com/datepicker/
Ce n'est pas répertorié comme méthode, mais il est là - comme fonction d'utilité. Recherchez la page "parsedate" et vous trouverez:
$ .datepicker.parseDate (format, valeur, paramètres) - Extraire une date d'une valeur de chaîne avec un format spécifié.
Exemple d'utilisation:
(Plus d'informations sur la spécification des formats de date se trouvent sur http://api.jqueryui.com/datepicker/#utility-parseDate )
Dans l'exemple ci-dessus, vous ne verriez pas le message d'alerte car '01 / 03/2012 'est une date valide dans le calendrier au format spécifié. Cependant, si vous avez rendu 'stringval' égal à '13 / 04/2013 ', par exemple, vous obtiendrez le message d'alerte, car la valeur '13 / 04/2013' n'est pas valide pour le calendrier.
Si une valeur de chaîne transmise est correctement analysée, la valeur de 'testdate' serait un objet Javascript Date représentant la valeur de chaîne transmise. Sinon, ce ne serait pas défini.
la source
J'ai vraiment aimé l'approche de Christoph (mais je n'avais pas assez de réputation pour voter). Pour mon usage, je sais que j'aurai toujours un objet Date, donc je viens de prolonger la date avec une méthode valid ().
Maintenant, je peux simplement écrire ceci et c'est beaucoup plus descriptif que de simplement vérifier isFinite dans le code ...
la source
isFinite
travail pour moi parfaitement. Mais oui, inutile d'étendre le prototype.!isFinite
sur unDate
attraper le fait que l'Date
estInvalid Date
. Il convient également de noter que mon contexte est à l'intérieur de Node.la source
vous pouvez vérifier le format valide de txDate.value avec ce scirpt. s'il était dans un format incorrect, la date n'est pas instanciée et renvoie null à dt.
Et comme l'a suggéré @ MiF en bref
la source
J'utilise le code suivant pour valider les valeurs de l'année, du mois et de la date.
Pour plus de détails, reportez-vous à Vérifier la date en javascript
la source
str
n'est pas utilisé.Trop de réponses compliquées ici déjà, mais une simple ligne suffit (ES5):
ou même dans ES6:
la source
Date.parse(true)
, j'obtiens correctement un NaN.J'ai vu des réponses très proches de ce petit extrait.
Manière JavaScript:
Manière TypeScript:
la source
Bonne solution! Inclus dans ma bibliothèque de fonctions auxiliaires, il ressemble maintenant à ceci:
la source
Cela a juste fonctionné pour moi
Mais cela n'a pas fonctionné
la source
`${new Date('foo')}` === 'Invalid Date'
Pour les projets Angular.js, vous pouvez utiliser:
la source
Aucune de ces réponses n'a fonctionné pour moi (testée dans Safari 6.0) lorsque vous essayez de valider une date telle que le 31/02/2012, cependant, elles fonctionnent correctement lorsque vous essayez une date supérieure à 31.
J'ai donc dû faire un peu de force brute. En supposant que la date est au format
mm/dd/yyyy
. J'utilise @broox answer:la source
&& value.split('/')[0] == (d.getMonth()+1);
new Date('string date')
est équivalente àDate.parse('string date')
, voir: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… afin que vous puissiez obtenir de fausses valeurs vraies ou fausses.Aucune des solutions ci-dessus n'a fonctionné pour moi.
le code ci-dessus verra quand JS fera le 31/02/2012 au 03/02/2012 que ce n'est pas valide
la source
la source
J'ai écrit cette fonction. Passez-lui un paramètre de chaîne et il déterminera s'il s'agit d'une date valide ou non basée sur ce format "jj / MM / aaaa".
voici un test
entrée: "hahaha", sortie: false.
entrée: "29/2/2000", sortie: vrai.
entrée: "29/2/2001", sortie: false.
la source
Date.prototype.toISOString
jetteRangeError
(au moins dans Chromium et Firefox) à des dates invalides. Vous pouvez l'utiliser comme moyen de validation et ne pas avoir besoin enisValidDate
tant que tel (EAFP). Sinon c'est:la source
Inspiré par l'approche de Borgar, je me suis assuré que le code non seulement valide la date, mais s'assure en fait que la date est une date réelle, ce qui signifie que des dates comme 31/09/2011 et 29/02/2011 ne sont pas autorisées.
la source
dd/MM/yyyy
notation. De plus, il retournetrue
lorsqu'il est valide et'Invalid date!'
si ce n'est pas le cas, il vaut mieux ne renvoyer qu'un seul type.J'ai combiné les meilleurs résultats de performance que j'ai trouvés autour de cette vérification si un objet donné:
Le résultat est le suivant:
la source
L'objet date à chaîne est un moyen plus simple et plus fiable de détecter si les deux champs sont une date valide. Par exemple, si vous entrez ce "-------" dans le champ de saisie de la date. Certaines des réponses ci-dessus ne fonctionneront pas.
la source
La réponse choisie est excellente et je l'utilise également. Cependant, si vous cherchez un moyen de valider la saisie de la date de l'utilisateur, vous devez savoir que l'objet Date est très persistant pour transformer ce qui peut sembler être des arguments de construction non valides en arguments valides. Le code de test unitaire suivant illustre ce point:
la source
Appelez ça comme ça
la source
Une fonction prête basée sur la réponse la mieux notée:
la source
Solution simple et élégante:
sources:
[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c
[2] Date incorrecte affichée dans la nouvelle date () en JavaScript
la source
date.getDate() == day
est insuffisant pour déterminer si la date est valide. Le format de date d'origine renverra une date non valide dans certaines implémentations, que la date soit valide ou non. "1970-01-01 00:00", si analysé correctement, renvoie false (c'est-à-direBoolean(+new Date("1970-01-01"))
renvoie false).const date = new Date(year, month, day);
Notez que le mois est 0 indexé de cette façon, vous devrez donc en soustraire un pour l'aligner correctement.Je pense qu'une partie de ce processus est long. Nous pouvons le raccourcir comme indiqué ci-dessous:
la source
Pour les composants basés sur int 1 d'une date:
Tests:
la source