Cabaran:
Anda berusaha untuk mengesahkan format daripada rentetan input tarikh sebagai "mm/dd/yyyy." Walau bagaimanapun, coretan kod sedia ada yang anda cuba gagal melaksanakan tugas ini dengan berkesan.
Soalan:
Apakah yang boleh menjadi isu asas dalam kod pengesahan tarikh yang disediakan?
Penjelasan:
Kod yang diberikan bertujuan untuk mengesahkan rentetan tarikh mengikut format "mm/dd/yyyy". Walau bagaimanapun, mungkin terdapat beberapa ralat atau ketidakkonsistenan dalam kod yang menghalangnya daripada berfungsi dengan betul. Mari kita periksa kod dan kenal pasti isu yang berpotensi:
<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>
Satu kemungkinan masalah dengan kod ini ialah cuba mengekstrak bulan sebagai bulan = ExpiryDate.substring(0, 2) - 1. Ini menolak 1 daripada bulan nilai, berpotensi mengakibatkan nombor bulan tidak sah. Untuk membetulkannya, anda harus mengekstrak bulan sebagai bulan = parseInt(ExpiryDate.substring(0, 2), 10) - 1.
Satu lagi isu yang berpotensi terletak pada pengendalian tahun. Kod menyemak sama ada tahun itu berada dalam julat 1000 hingga 3000, tetapi ia tidak mengambil kira kemungkinan tahun 2 digit (mis., "19" atau "20"). Untuk menampung kedua-dua tahun 2 digit dan 4 digit, anda boleh mengubah suai pengekstrakan tahun dan logik pengesahan seperti berikut:
<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>
Selain itu, kod pada masa ini menganggap bahawa format "mm/dd/yyyy" ialah dipatuhi dengan ketat. Jika anda ingin lebih berlembut dan membenarkan format rentetan tarikh yang fleksibel (cth., membenarkan aksara pemisahan selain garis miring), anda perlu mengubah suai kod dengan sewajarnya.
Atas ialah kandungan terperinci Mengapakah kod pengesahan tarikh JavaScript gagal untuk mengesahkan format \'mm/dd/yyyy\' dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!