Maison  >  Article  >  interface Web  >  Pourquoi le code de validation de date JavaScript ne parvient-il pas à valider correctement le format \"mm/jj/aaaa\" ?

Pourquoi le code de validation de date JavaScript ne parvient-il pas à valider correctement le format \"mm/jj/aaaa\" ?

DDD
DDDoriginal
2024-10-30 09:24:02297parcourir

Why does the JavaScript date validation code fail to validate the

Validation du format de date "mm/jj/aaaa" en JavaScript

Défi :

Vous cherchez à valider le format d'une chaîne d'entrée de date sous la forme "mm/jj/aaaa". Cependant, un extrait de code existant que vous avez essayé n'a pas réussi à effectuer cette tâche efficacement.

Question :

Quel pourrait être le problème sous-jacent dans le code de validation de date fourni ?

Explication :

Le code donné vise à valider les chaînes de date suivant le format "mm/jj/aaaa". Cependant, il peut y avoir des erreurs ou des incohérences dans le code qui empêchent son bon fonctionnement. Inspectons le code et identifions les problèmes potentiels :

<code class="js">function isDate(ExpiryDate) {
  var objDate, // date object initialized from the ExpiryDate string
    mSeconds, // ExpiryDate in milliseconds
    day, // day
    month, // month
    year; // year
  // date length should be 10 characters (no more no less)
  if (ExpiryDate.length !== 10) {
    return false;
  }
  // third and sixth character should be '/'
  if (ExpiryDate.substring(2, 3) !== '/' || ExpiryDate.substring(5, 6) !== '/') {
    return false;
  }
  // extract month, day and year from the ExpiryDate (expected format is mm/dd/yyyy)
  // subtraction will cast variables to integer implicitly (needed
  // for !== comparing)
  month = ExpiryDate.substring(0, 2) - 1; // because months in JS start from 0
  day = ExpiryDate.substring(3, 5) - 0;
  year = ExpiryDate.substring(6, 10) - 0;
  // test year range
  if (year < 1000 || year > 3000) {
    return false;
  }
  // convert ExpiryDate to milliseconds
  mSeconds = new Date(year, month, day).getTime();
  // initialize Date() object from calculated milliseconds
  objDate = new Date();
  objDate.setTime(mSeconds);
  // compare input date and parts from Date() object
  // if difference exists then date isn't valid
  if (
    objDate.getFullYear() !== year ||
    objDate.getMonth() !== month ||
    objDate.getDate() !== day
  ) {
    return false;
  }
  // otherwise return true
  return true;
}</code>

Un problème possible avec ce code est de tenter d'extraire le mois sous la forme mois = ExpiryDate.substring(0, 2) - 1. Cela soustrait 1 du mois valeur, ce qui pourrait entraîner des numéros de mois invalides. Pour corriger cela, vous devez extraire le mois sous la forme Month = parseInt(ExpiryDate.substring(0, 2), 10) - 1.

Un autre problème potentiel réside dans la gestion de l'année. Le code vérifie si l'année se situe entre 1 000 et 3 000, mais il ne prend pas en compte la possibilité d'une année à 2 chiffres (par exemple « 19 » ou « 20 »). Pour prendre en charge les années à 2 et 4 chiffres, vous pouvez modifier la logique d'extraction et de validation de l'année comme suit :

<code class="js">// extract year
if (ExpiryDate.substring(6, 7) === '/') {
  year = parseInt(ExpiryDate.substring(6, 8), 10); // 2-digit year
} else {
  year = parseInt(ExpiryDate.substring(6, 10), 10); // 4-digit year
}
// test year range
if (year < 1000 || year > 2999) {
  return false;
}</code>

De plus, le code suppose actuellement que le format "mm/jj/aaaa" est strictement respecté. Si vous souhaitez être plus indulgent et autoriser des formats de chaîne de date flexibles (par exemple, autoriser des caractères de séparation autres que des barres obliques), vous devez modifier le code en conséquence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn