>웹 프론트엔드 >JS 튜토리얼 >JavaScript 날짜 확인 코드가 \'mm/dd/yyyy\' 형식을 올바르게 확인하지 못하는 이유는 무엇입니까?

JavaScript 날짜 확인 코드가 \'mm/dd/yyyy\' 형식을 올바르게 확인하지 못하는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-30 09:24:02366검색

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>

이 코드에서 발생할 수 있는 문제 중 하나는 월을 Month = ExpiryDate.substring(0, 2) - 1로 추출하려고 시도하는 것입니다. 그러면 월에서 1이 뺍니다. 값으로 인해 잘못된 월 수가 표시될 수 있습니다. 이를 수정하려면 월을 Month =parseInt(ExpiryDate.substring(0, 2), 10) - 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.