ホームページ > 記事 > ウェブフロントエンド > 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 サイトの他の関連記事を参照してください。