2014-01-06 4 views
2

길이가 8 인 문자열을 ddmmyyyy 형식으로 입력하는 날짜 유효성 검사기를 작성하려고합니다. 유효한 날짜에 대한 모든 기본 사항을 확인하고 그 결과로 true 또는 false를 반환해야합니다.날짜 유효성 검사기 만들기

나는 순간과 같은 추가 라이브러리를 사용할 수 없으며 정규 표현식을 사용할 수 없습니다 (이것은 숙제가 아니며 단지 이러한 제약 조건 내에서 작동하도록되어 있습니다).

사람들이 내가 아래에 무엇이 잘못되었는지 말할 수 있다면 감사하겠습니다!

function isValidDate(i) { 

    if (i.length == 8) { 
     var dd = i.substring(0, 2); 
     var mm = i.substring(2, 4); 
     var yyyy = i.substring(4, 7); 
     var day = parseInt(dd,10); 
     var month = parseInt(mm,10); 
     var year = parseInt(yyyy,10); 
     if (year % 4 != 0 && day = 29 && month = 02) { 
      return false; 
     } else if (day > 31) { 
      return false; 
     } else if (month > 12) { 
      return false; 
     } else { 
      return true; 
     } 
    } else { 
     return false; 
    } 
    return true; 
} 
+3

문자열을 변수'yyyy','mm','dd'로 분할 한 후에는 해당 데이터에서 새 Date 객체를 만들고 Date 객체가 Date 객체를 만들기 위해 계류 된 동일한 변수를 포함하는지 확인할 수 있습니다. – Epsil0neR

+1

귀하의 함수는 30 일 밖에 걸리지 않는 달에 대해 31 일을 허용합니다. – Barmar

+2

또한 윤년을 제외하고 2 월 30 일과 2 월 31 일까지 허용하지만 2 월 29 일을 허용하지 않습니다 (그러나 윤년의 세기 규칙은 알지 못합니다). – Barmar

답변

1

이러한 기능을 사용할 수 있습니다. 이 함수는 제공된 인수가 유효한 정수 값인지 확인합니다 (정수로 구문 분석하고 NaN이 아닌지 확인). 그리고 월 및 일이 유효한지 확인하지만 연도가 임의의 숫자 일 수 있기 때문에 연도의 유효성을 검사하지 않습니다.

function dateValidation(year, month, day){ 
    // Check arguments 
    year = parseInt(year); 
    if (isNaN(year)) return false; 

    month = parseInt(month); 
    if (isNaN(month)) return false; 

    day = parseInt(day); 
    if (isNaN(day)) return false; 

    // Check if month is correct 
    if (!(month >= 1 && month <= 12)) return false; 

    switch (month){ 
     case 1: //January 
     case 3: // March 
     case 5: // May 
     case 7: // July 
     case 8: // Augyst 
     case 10:// October 
     case 12:// December 
      return (day > 0 && day <= 31); // Maximum days is 31 in these months 
      break 
     case 4: // April 
     case 6: // June 
     case 9: // September 
     case 11:// November 
      return (day > 0 && day <= 30); // Maximum days is 30 in these months 
      break 
     case 2: // February 
      if (year % 4 != 0){ 
       return (day > 0 && day <= 28); 
      } else { 
       return (day > 0 && day <= 29); 
      break 
      } 
     default: 
      return false; 
    } 
} 
+1

고맙습니다. 케이스 사용은 매우 유용합니다. – user3165009

+0

이 답변을 도움이 될 수 있도록 투표 할 수도 있습니다 (투표 결과) – Epsil0neR

+0

내 평판이 나에게는 분명히 없습니다! – user3165009

1

첫 번째 실수는 == 대신 ==를 사용하는 것입니다.

다음 하나에서는 parseInt 02에서 2를 만들 것 때문에 경우는 할당이 항상에 true를 돌려줍니다 그래서 그냥 == 2

if (year % 4 != 0 && day == 29 && month == 2) { 

을 비교할 수없는 정수로 02을 사용하는 것입니다 문과 년 2014 년까지 % 4이 (가) 0이 아니므로 2016 년까지 항상 "false false"로 끝납니다.

+0

감사합니다. 그런 어리석은 실수에 사과드립니다. – user3165009