37 votes

JavaScript détectant les dates valides

Double Possible:
La détection d'une “date invalide” instance de Date en JavaScript

J'ai été en utilisant la suite pour détecter une date valide:

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

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

Mais a constaté que la Date.analyser pense que les éléments suivants sont des dates de validité (mm/jj/aaaa)

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

Tout autre moyen de détecter des dates non valides lorsque le nombre de jours dépasse le nombre total de jours dans le mois?

Mise à JOUR: Un encore plus grand problème, c'est que le plugin jQuery validation ne détecte pas cela comme une date non valide soit!

SOLUTION:

Basé sur @Guffa de commentaires, 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);
}

75voto

Guffa Points 308133

Pour vérifier si une date est valide, vous pouvez analyser les composants de la date, de créer un Date objet à partir d'elle, et de vérifier si les composants dans les données est le même que l'analyse des composants. Si vous créez un Date objet de compnents qui sont hors de portée, les valeurs de débit à la prochaine/précédente période pour créer une date valide.

Par exemple, new Date(2011,0,42) permettra de créer un objet qui contient la date 2/11/2011 au lieu de 1/42/2011.

Par l'analyse des composants au lieu de la date complète vous permettra également de contourner le problème avec les différents formats de date. Mon navigateur par exemple s'attendre à un format de date comme y-m-d plutôt que d' 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/

3voto

James Clark Points 1214

Si votre format de la date est fixée comme M/D/YYYY, vous pourriez re-format de l'analyse de la date et de voir si elle correspond à l'entrée:

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

Cependant, qui ne tolère pas les espaces ou des zéros numéros.

Si vous n'avez pas besoin de garder l'entrée de l'utilisateur exactement, vous pourriez tout reformater le jour de toute façon et de faire semblant que c'est ce qu'ils ont saisies.

Mais si vous ne pouvez pas le faire, je voudrais analyser les composants moi-même à l'aide d'une RegExp puis de les comparer à des valeurs de l' Date méthodes.

0voto

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")
   }
}
 

OFC, vous aurez également besoin de quelque chose pour surveiller les années bissextiles, mais n'oubliez pas 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 ne soient divisibles par 4. Cela devrait être facile à inclure dans cette fonction.

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