web-dev-qa-db-fra.com

Comment tester une chaîne est une date valide ou ne pas utiliser moment?

Je voudrais tester si une date et/ou une heure entrée est valide.

Cela peut-il être fait à un moment où les tests de date et d'heure avec JavaScript semblent un cauchemar. (ont passé des heures sur cela).

Les données de test ressemblent à ceci.

invalide

invalid = ""
invalid = " "
invalid = "x"
invalid = "1/1"
invalid = "30/2/2015"
invalid = "2/30/2015"

est valide

isvalid = "1/12/2015"
isvalid = "1/12/2015 1:00 PM";

J'ai essayé diverses méthodes javascript sans succès pendant des heures.

Je pensais que le moment aurait quelque chose pour cela. J'ai donc essayé ce qui suit, ce qui ne fonctionne pas car je ne pense pas que le moment fonctionne de la sorte.

var valid = moment(input).isDate()
var valid = moment().isDate(input)

Mon format de temps est "jj/mm/aaaa"

38
Valamas

Oui, vous pouvez utiliser momentjs pour l'analyser et le comparer avec la chaîne

function isValidDate(str) {
  var d = moment(str,'D/M/YYYY');
  if(d == null || !d.isValid()) return false;

  return str.indexOf(d.format('D/M/YYYY')) >= 0 
      || str.indexOf(d.format('DD/MM/YYYY')) >= 0
      || str.indexOf(d.format('D/M/YY')) >= 0 
      || str.indexOf(d.format('DD/MM/YY')) >= 0;
}

Code de test

tests = ['',' ','x','1/1','1/12/2015','1/12/2015 1:00 PM']
for(var z in tests) {
  var test = tests[z];
  console.log('"' + test + '" ' + isValidDate(test));
}

Sortie

 "" false
 " " false
 "x" false
 "1/1" false
 "1/12/2015" true
 "1/12/2015 1:00 PM" true
34
Kokizzu

Moment a une fonction appelée isValid .

Vous souhaitez utiliser cette fonction avec le format de date cible et le paramètre d'analyse strict sur true (sinon votre validation pourrait ne pas être cohérente) pour déléguer à la bibliothèque toutes les vérifications nécessaires (comme les années bissextiles):

var dateFormat = "DD/MM/YYYY";
moment("28/02/2011", dateFormat, true).isValid(); // return true
moment("29/02/2011", dateFormat, true).isValid(); // return false: February 29th of 2011 does not exist, because 2011 is not a leap year
96
Luca Fagioli