72 votes

Comment valider une date?

J'essaie de vérifier que la date est valide, en ce sens que si quelqu'un entre 2/30/2011 alors ce devrait être faux.

Comment puis-je faire cela avec n'importe quelle date?

128voto

RobG Points 41170

Un moyen simple de valider une chaîne de date consiste à convertir en un objet de date et à tester, par exemple:

 // Expect input as d/m/y
function isValidDate(s) {
  var bits = s.split('/');
  var d = new Date(bits[2], bits[1] - 1, bits[0]);
  return d && (d.getMonth() + 1) == bits[1] && d.getDate() == Number(bits[0]);
} 
 

Vous devez seulement tester 2 des 3 parties de la date. Vous pouvez également tester les bits de la chaîne de date:

 function isValidDate2(s) {
  var bits = s.split('/');
  var y = bits[2], m  = bits[1], d = bits[0];
  // Assume not leap year by default (note zero index for Jan)
  var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];

  // If evenly divisible by 4 and not evenly divisible by 100,
  // or is evenly divisible by 400, then a leap year
  if ( (!(y % 4) && y % 100) || !(y % 400)) {
    daysInMonth[1] = 29;
  }
  return d <= daysInMonth[--m]
}
 

10voto

Piotr Kwiatek Points 51

La première fonction isValidDate (s) proposée par RobG fonctionnera-t-elle pour la chaîne d'entrée '1/2 /'? Je ne pense pas, car l'année n'est pas validée (

Ma proposition est d'utiliser une version améliorée de cette fonction:

 //input in ISO format: yyyy-MM-dd
function DatePicker_IsValidDate(input) {
        var bits = input.split('-');
        var d = new Date(bits[0], bits[1] - 1, bits[2]);
        return d.getFullYear() == bits[0] && (d.getMonth() + 1) == bits[1] && d.getDate() == Number(bits[2]);
}
 

4voto

Luke Cordingley Points 371

Cette solution ne s'adresse pas évident date de validations de tel que de s'assurer de la date de pièces sont des entiers, ou que la date de pièces de respecter évident contrôles de validation telles que la journée étant supérieur à 0 et inférieur à 32. Cette solution suppose que vous avez déjà tous date de trois pièces (année, mois, jour) et que chaque passe déjà évident validations. Compte tenu de ces hypothèses, cette méthode devrait fonctionner tout simplement pour vérifier si la date existe.

Par exemple, le 29 février 2009 n'est pas une date réelle, mais le 29 février 2008. Lorsque vous créez un nouvel objet Date, tels que le 29 février 2009 regardez ce qui se passe (n'oubliez pas que le mois de repartir à zéro en JavaScript):

console.log(new Date(2009, 1, 29));

Au-dessus de la ligne de produits: Sun Mar 01 2009 00:00:00 GMT-0800 (PST)

Remarquez comment la date obtient tout simplement laminées, le premier jour du mois suivant. En supposant que vous avez les autres, évident validations en place, cette information peut être utilisée pour déterminer si une date est réel avec la fonction suivante (Cette fonction permet de non-partant de zéro mois pour un plus commode d'entrée):

var isActualDate = function (month, day, year) {
    var tempDate = new Date(year, --month, day);
    return month === tempDate.getMonth();
};

Cette solution n'est pas complète et ne prennent pas de i18n en compte, mais qui pourrait être plus robuste.

4voto

Dhayalan Points 1
 var isDate_ = function(input) {
        var status = false;
        if (!input || input.length <= 0) {
          status = false;
        } else {
          var result = new Date(input);
          if (result == 'Invalid Date') {
            status = false;
          } else {
            status = true;
          }
        }
        return status;
      }
 

cette fonction renvoie une valeur booléenne indiquant si l'entrée donnée est une date valide ou non. ex:

 if(isDate_(var_date)) {
  // statements if the date is valid
} else {
  // statements if not valid
}
 

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