Quel est un moyen simple de vérifier si une valeur est une date valide, n'importe quel format de date connu autorisé.
Par exemple , j'ai les valeurs 10-11-2009
, 10/11/2009
, 2009-11-10T07:00:00+0000
qui devraient tous être reconnus comme des valeurs de date, et les valeurs 200
, 10
, 350
qui ne doivent pas être considérés comme une valeur de date. Quelle est la manière la plus simple de vérifier cela, si cela est même possible? Parce que les horodatages seraient également autorisés.
javascript
date-format
Thizzer
la source
la source
Réponses:
Cela
Date.parse()
suffirait?Voir sa page relative à la documentation MDN .
la source
Date.parse("4.3")
est986270400000
.Mise à jour 2015
C'est une vieille question mais d'autres nouvelles questions comme:
être fermé en double de celui-ci, donc je pense qu'il est important d'ajouter de nouvelles informations ici. Je l'écris parce que j'ai eu peur de penser que les gens copient et collent une partie du code affiché ici et l'utilisent en production.
La plupart des réponses ici utilisent soit des expressions régulières complexes qui ne correspondent qu'à certains formats très spécifiques et le font en fait de manière incorrecte (comme la correspondance du 32 janvier sans correspondance avec la date ISO réelle comme annoncé - voir la démo ), soit elles essaient de transmettre quoi que ce soit au
Date
constructeur et souhaite le meilleur.Utiliser Moment
Comme je l'ai expliqué dans cette réponse, il existe actuellement une bibliothèque disponible pour cela: Moment.js
Il s'agit d'une bibliothèque pour analyser, valider, manipuler et afficher les dates en JavaScript, qui possède une API beaucoup plus riche que les fonctions de gestion de date JavaScript standard.
Il est réduit à 12 Ko / gzippé et fonctionne dans Node.js et d'autres endroits:
En utilisant Moment, vous pouvez être très précis sur la vérification des dates valides. Parfois, il est très important d'ajouter quelques indices sur le format que vous attendez. Par exemple, une date telle que 22/06/2015 ressemble à une date valide, sauf si vous utilisez un format JJ / MM / AAAA, auquel cas cette date doit être rejetée comme non valide. Il existe plusieurs façons de dire à Moment à quel format vous vous attendez, par exemple:
L'
true
argument est là, donc le Moment n'essaiera pas d'analyser l'entrée si elle n'est pas exactement conforme à l'un des formats fournis (ce devrait être un comportement par défaut à mon avis).Vous pouvez utiliser un format fourni en interne:
Et vous pouvez utiliser plusieurs formats en tant que tableau:
Voir: DEMO .
Autres bibliothèques
Si vous ne souhaitez pas utiliser Moment.js, il existe également d'autres bibliothèques:
Mise à jour 2016
J'ai créé le module immoment qui est comme (un sous-ensemble de) Moment mais sans surprise causé par la mutation d'objets existants (voir la documentation pour plus d'informations).
Mise à jour 2018
Aujourd'hui, je recommande d'utiliser Luxon pour la manipulation de date / heure au lieu de Moment, ce qui (contrairement à Moment) rend tous les objets immuables donc il n'y a pas de mauvaises surprises liées à la mutation implicite des dates.
Plus d'informations
Voir également:
Une série d'articles de Rob Gravelle sur les bibliothèques d'analyse de dates JavaScript:
Conclusion
Bien sûr, n'importe qui peut essayer de réinventer la roue, écrire une expression régulière (mais veuillez lire ISO 8601 et RFC 3339 avant de le faire) ou appeler des constructeurs intégrés avec des données aléatoires pour analyser les messages d'erreur comme
'Invalid Date'
(Êtes-vous sûr que ce message est exactement la même sur toutes les plates-formes? Dans tous les pays? À l'avenir?) ou vous pouvez utiliser une solution testée et utiliser votre temps pour l'améliorer, pas la réinventer. Toutes les bibliothèques répertoriées ici sont des logiciels libres et open source.la source
moment("whatever 123").isValid()
retournetrue
.moment("06/22/2015", "DD/MM/YYYY", true).isValid();
avec le format de date attendu explicitement fourni et avec un argumenttrue
signifiant une vérification stricte. J'ai mis à jour ma réponse avec plus d'informations et de meilleurs exemples.Voici comment j'ai résolu ce problème dans une application sur laquelle je travaille en ce moment:
mis à jour sur la base des commentaires de krillgar:
la source
new Date(date)
ne vous donne pas de «date non valide».new Date(date) !== "Invalid Date"
sera toujours revenir vrai puisque l'expression gauche renverra un objet Date avec un TEMPSVAL de NaN , qui ne peut jamais être===
une chaîne. Utilisation de==
"travaux" en raison de la conversion de type. Mais comme l'analyse des chaînes de date dépend encore largement de l'implémentation, s'appuyer sur elle pour analyser des formats aléatoires nous a sérieusement faussés.isDate('Mac OS X 10.14.2')
renvoie vrai ici.new Date(date) === 'Invalid Date'
ne fonctionne que dans Firefox et Chrome. IE8 (celui que j'ai sur ma machine à des fins de test) donne NaN.Comme indiqué dans la réponse acceptée,
Date.parse(date)
fonctionnera également pour les chiffres. Donc, pour contourner cela, vous pouvez également vérifier qu'il ne s'agit pas d'un nombre (si c'est quelque chose que vous souhaitez confirmer).la source
isNan
n'est pas une fonction; cas incorrect en première instance.date
c'est le casFoostreet 1
, votre condition est évaluée comme vraie.Que diriez-vous quelque chose comme ça? Il testera s'il s'agit d'un objet Date ou d'une chaîne de date:
Je dois mentionner que cela ne teste pas les chaînes au format ISO, mais avec un peu plus de travail sur RegExp, vous devriez être bon.
la source
Aucune des réponses ici ne permet de vérifier si la date n'est pas valide, comme le 31 février. Cette fonction corrige cela en vérifiant si le mois retourné est équivalent au mois d'origine et en s'assurant qu'une année valide a été présentée.
la source
Utilisez l'expression régulière pour le valider.
la source
En me référant à tous les commentaires ci-dessus, je suis parvenu à une solution.
Cela fonctionne si le
Date
passé est au format ISO ou doit être manipulé pour d'autres formats.Vous pouvez jouer ici sur JSFiddle.
la source
YYYY-MM-DD
, il est donc trivial de joindreT00:00:00.000Z
et d'utiliser cette solution pour vérifier les chaînes valides.Voici une fonction améliorée qui utilise uniquement
Date.parse()
:Remarque: Date.parse () analysera les nombres: par exemple
Date.parse(1)
, renverra une date. Nous vérifions donc ici si ces
n'est pas un nombre, si c'est une date.la source
Je ferais ça
Jouez ici
la source
EXAMPLE STRING 12345
et elle renvoie "date valide".Voici une version minimaliste.
la source
isDate(" 1")
Cette fonction appelable fonctionne parfaitement, renvoie true pour une date valide. Assurez-vous d'appeler en utilisant une date au format ISO (aaaa-mm-jj ou aaaa / mm / jj):
la source
return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
Je sais que c'est une vieille question, mais j'ai fait face au même problème et j'ai vu qu'aucune des réponses ne fonctionnait correctement - en particulier en éliminant les nombres (1 200 345, etc.) des dates, ce qui est la question d'origine. Voici une méthode plutôt peu orthodoxe à laquelle je pourrais penser et elle semble fonctionner. Veuillez indiquer s'il y a des cas où cela échouera.
C'est la ligne pour éliminer les chiffres. Ainsi, la fonction entière pourrait ressembler à:
la source
console.log("hello 1 ", isDate("hello 1 "));
retourne vraiest-il correct de vérifier si une fonction liée à la date est disponible pour que l'objet trouve s'il s'agit d'un objet Date ou non?
comme
la source
C'est ainsi que je finis par le faire. Cela ne couvrira pas tous les formats. Vous devez vous ajuster en conséquence. Je contrôle le format, donc ça marche pour moi
la source
Ok, c'est une vieille question, mais j'ai trouvé une autre solution en vérifiant les solutions ici. Pour moi, cela fonctionne pour vérifier si la fonction getTime () est présente dans l'objet date:
la source
Une bibliothèque légère est prête pour vous: Day.js
la source
Par défaut, ce paramètre est défini sur TRUE. Ainsi, même les chaînes de format incorrect renvoient de bonnes valeurs.
Je l'ai utilisé quelque chose comme ça:
la source
Essaye ça:
la source