web-dev-qa-db-fra.com

JavaScript détectant les dates valides

Dupliquer possible:
Détection d'une «date non valide» Instance de date en JavaScript

J'utilisais les éléments suivants pour détecter une date valide:

var text = $('#Date').val();
var date = Date.parse(text);

if (isNaN(date)) {
      // Invalid date
}

Mais trouvé que Date.parse pense que les dates suivantes sont des dates valides (mm/jj/aaaa)

  • 2/30/2011 
  • 31/11/2011

Un autre moyen de détecter les dates non valides lorsque le nombre de jours dépasse le nombre total de Jours dans le mois?

MISE À JOUR: Un problème encore plus important est que le plug-in de validation jQuery ne détecte pas cela comme une date non valide!

SOLUTION:

Sur la base des commentaires de @ Guffa, j'ai créé la fonction suivante pour valider les dates:

function validDate(text) {

    var date = Date.parse(text);

    if (isNaN(date)) {
        return false;
    }

    var comp = text.split('/');

    if (comp.length !== 3) {
        return false;
    }

    var m = parseInt(comp[0], 10);
    var d = parseInt(comp[1], 10);
    var y = parseInt(comp[2], 10);
    var date = new Date(y, m - 1, d);
    return (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d);
}
37
Nick Olsen

Pour vérifier si une date est valide, vous pouvez analyser les composants de la date, créer un objet Date à partir de celui-ci et vérifier si les composants des données sont identiques à ceux des composants analysés. Si vous créez un objet Date à partir de composants hors limites, les valeurs seront transférées à la période suivante/précédente pour créer une date valide.

Par exemple, new Date(2011,0,42) créera un objet contenant la date du 11/02/2011 au lieu de 1/42/2011.

En analysant les composants au lieu de la date complète, vous éviterez le problème avec différents formats de date. Mon navigateur s'attend par exemple à un format de date tel que y-m-d plutôt que d/m/y.

Exemple:

var text = '2/30/2011';
var comp = text.split('/');
var m = parseInt(comp[0], 10);
var d = parseInt(comp[1], 10);
var y = parseInt(comp[2], 10);
var date = new Date(y,m-1,d);
if (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d) {
  alert('Valid date');
} else {
  alert('Invalid date');
}

Démo: http://jsfiddle.net/Guffa/UeQAK/

75
Guffa

Si votre format de date est fixé à M/D/YYYY, vous pouvez reformater la date analysée et voir si elle correspond à l'entrée:

var d = new Date(Date.parse(str))
return str === (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear();

Cependant, cela ne tolérera pas les espaces ni les chiffres remplis de zéros.

Si vous n'avez pas besoin de conserver exactement les entrées de l'utilisateur, vous pouvez tout simplement reformater la date et prétendre que c'est ce qu'il a tapé.

Mais si vous ne pouvez pas le faire non plus, j'analyserais moi-même les composants à l'aide d'un RegExp, puis les comparerais aux valeurs des méthodes Date.

3
James Clark

Vous pouvez écrire un script pour le faire manuellement:

function checkDate(day, month) {
   if ((month == 4 || month == 6 || month == 9 || month == 11) && day < 30) {
       alert("Date is valid")
   }
   else if (month == 2 && day <= 28) {
       alert("Date is valid")
   }
   else if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day <= 31) {
       alert("Date is valid")
   }
   else {
       alert("Date is in-valid")
   }
}

Bien sûr, vous aurez également besoin de regarder les années bissextiles, mais rappelez-vous que toute année divisible par 4 et non par 100 est une année bissextile à moins que les deux premiers chiffres de l’année soient divisibles par 4. Cela devrait être facile inclure dans cette fonction.

L'exemple est faux

le correct est

if ((month == 4 || month == 6 || month == 9 || month == 11) && day <= 30)

<= au lieu de =

Mais l'exemple est génial!

0
Thales Violakis