Rumah  >  Artikel  >  hujung hadapan web  >  Mengapakah kod pengesahan tarikh JavaScript gagal untuk mengesahkan format \"mm/dd/yyyy\" dengan betul?

Mengapakah kod pengesahan tarikh JavaScript gagal untuk mengesahkan format \"mm/dd/yyyy\" dengan betul?

DDD
DDDasal
2024-10-30 09:24:02296semak imbas

Why does the JavaScript date validation code fail to validate the

Mengesahkan Format Tarikh "mm/dd/yyyy" dalam JavaScript

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn