ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript の日付検証コードが「mm/dd/yyyy」形式を正しく検証できないのはなぜですか?

JavaScript の日付検証コードが「mm/dd/yyyy」形式を正しく検証できないのはなぜですか?

DDD
DDDオリジナル
2024-10-30 09:24:02368ブラウズ

Why does the JavaScript date validation code fail to validate the

JavaScript での日付形式 "mm/dd/yyyy" の検証

課題:

形式を検証しようとしています日付入力文字列を「mm/dd/yyyy」として入力します。ただし、試行した既存のコード スニペットは、このタスクを効果的に実行できませんでした。

質問:

提供された日付検証コードの根本的な問題は何ですか?

説明:

指定されたコードは、「mm/dd/yyyy」形式に従う日付文字列を検証することを目的としています。ただし、コード内にエラーや不一致があり、正しく機能しない可能性があります。コードを調べて、潜在的な問題を特定してみましょう:

<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>

このコードで考えられる問題の 1 つは、月を month = ExpiryDate.substring(0, 2) - 1 として抽出しようとしていることです。これにより、月から 1 が減算されます。値が無効になる可能性があります。無効な月番号が発生する可能性があります。これを修正するには、月を month = parseInt(ExpiryDate.substring(0, 2), 10) - 1 として抽出する必要があります。

もう 1 つの潜在的な問題は、年の処理にあります。このコードは、年が 1000 から 3000 の範囲内にあるかどうかをチェックしますが、2 桁の年 (「19」や「20」など) の可能性は考慮されていません。 2 桁と 4 桁の年の両方に対応するには、年の抽出と検証のロジックを次のように変更できます。

<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>

さらに、コードは現在、「mm/dd/yyyy」形式であることを前提としています。厳守します。より寛大で、柔軟な日付文字列形式を許可したい場合 (スラッシュ以外の区切り文字を許可するなど)、それに応じてコードを変更する必要があります。

以上がJavaScript の日付検証コードが「mm/dd/yyyy」形式を正しく検証できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。