210 votes

Vérifier si la date est valide

Voici le scénario :

J'ai un String et un format de date différent. Ex :
date : 2016-10-19
dateFormat : "DD-MM-YYYY".

J'ai besoin de vérifier si cette date est une date valide.

J'ai essayé les choses suivantes

var d = moment("2016-10-19",dateFormat);

d.isValid() est de retour false à chaque fois. Moment.js n'analyse-t-il pas la date dans le format donné ?

J'ai ensuite essayé de formater la date en DD-MM-YYYY d'abord et ensuite le passer à Moment.js :

var d = moment("2016-10-19").format(dateFormat);
var date = moment(d, dateFormat);

Maintenant date.isValid() me donne le résultat souhaité, mais ici l'objet date de Moment.js est créé deux fois. Comment puis-je éviter cela ? Existe-t-il une meilleure solution ?

Pour info, je n'ai pas le droit de changer la dateFormat .

0 votes

N'avez-vous pas le droit de modifier la valeur de dateFormat ? Dans ce cas, vous devrez modifier le format de l'entrée, car le 19 octobre 2016 correspond à AAAA-MM-JJ et non à JJ-MM-AAAA. Que pouvez-vous modifier ?

0 votes

L'entrée provient du sélecteur de date. Je ne peux pas changer cela aussi :(

1 votes

Puis-je demander pourquoi vous n'êtes pas autorisé à modifier la variable dateFormat ? var d = moment("19-10-2016", "DD-MM-YYYY") ; résoudrait vos problèmes en ce qui me concerne.

274voto

Ganesh Points 1500

J'ai pu trouver la solution. Puisque la date que je reçois est au format ISO, il suffit de fournir la date à l'instant pour la valider, il n'est pas nécessaire de passer le dateFormat.

var date = moment("2016-10-19");

Et puis date.isValid() donne le résultat souhaité.

22 votes

Quelqu'un sait-il quelle est la méthode préférée actuelle ? Cette méthode génère maintenant le "Deprecation Warning" suivant : la construction du moment revient à js Date. Cette méthode est déconseillée et sera supprimée dans la prochaine version majeure. Veuillez vous référer à github.com/moment/moment/issues/1407 pour plus d'informations.

1 votes

12 votes

Juste pour vous dire que ça ne marche pas toujours : var a = moment('12345'); a.isValid() // is true Cette méthode échoue parce que moment se rabattra sur l'objet date par défaut s'il ne parvient pas à analyser la date. Or, l'objet date par défaut renvoie toujours une date (mais pas celle que vous voulez).

169voto

schutta Points 769

var date = moment('2016-10-19', 'DD-MM-YYYY', true);

Vous devez ajouter un troisième argument lorsque vous invoquez moment qui applique une analyse syntaxique stricte. Voici la partie pertinente de la documentation du moment http://momentjs.com/docs/#/parsing/string-format/ Il se trouve vers la fin de la section.

3 votes

Cela n'a aucun effet.

2 votes

Cette réponse devrait être la bonne réponse........@Begueradj cela a un effet, essayez d'utiliser différentes valeurs, parfois correctes et parfois fausses

1 votes

Et vous pouvez lire sur l'analyse syntaxique stricte aquí

22voto

gschambial Points 913

Voilà : Fidddle Working

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});

0 votes

Comme je l'ai dit, le format de date est "DD-MM-YYYY" et je ne suis pas autorisé à le modifier.

0 votes

Oh, je vois. Laissez-moi voir ça.

0 votes

Est-il permis de changer la chaîne de date ici 2016-10-19 ?

19voto

wakeupoj Points 31

J'utilise Moment avec New Date pour traiter les cas de undefined les valeurs des données :

const date = moment(new Date("2016-10-19"));

à cause de : moment(undefined).isValid() == true

où comme le meilleur moyen : moment(new Date(undefined)).isValid() == false

-3voto

Pochen Points 1609

Essayez celui-ci. Elle n'est pas très jolie mais elle fonctionnera tant que l'entrée est au format constant de votre sélecteur de date.

Il s'agit de badDate provenant de votre sélecteur dans cet exemple.

https://jsfiddle.net/xs8tvox9/

var dateFormat = 'DD-MM-YYYY'
var badDate = "2016-10-19";

var splittedDate = badDate.split('-');

if (splittedDate.length == 3) {
  var d = moment(splittedDate[2]+"-"+splittedDate[1]+"-"+splittedDate[0], dateFormat);
  alert(d.isValid())
} else {
  //incorrectFormat
}

5 votes

S'il vous plaît, ne faites pas ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X