2013-04-06 2 views
1

나는 사용자가 입력 한 날짜를 가지고 다음을 수행 할 수있는 편리한 방법을 찾고 있었다 자바 스크립트에 날짜를 입력 : 입력 된 날짜가 유효한지해석 사용자는

1) 결정을하고이 유효한 경우, 반환 와 객체 :

2) 자바 스크립트 Date 객체

3) 날짜는 전형적인 형식 (MM-DD- 포맷 MySQL의 형식으로 포맷 된 날짜 (YYYY-MM-DD)

4) YYYY)

결국 Regex를 사용하고 YYYY-MM-DD, YYYY/MM/DD, MM-DD-YY, MM/DD/YY, MM-DD-YYYY 또는 MM의 입력을 처리 할 수있는 자체 함수를 작성했습니다./DD/YYYY.

이 함수가 mySQL 형식과 정규 형식을 개체에 반환하는 이유는 간단합니다. 내 웹 응용 프로그램에는 필드에 표시 할 표준 형식과 데이터를 저장할 때 서버에 보내는 mysql 형식이 필요합니다.

코드는 내 대답에 아래에 표시됩니다. 코드를 최적화하는 방법이있을 것이라고 확신하지만 읽기 쉽도록 부분적으로 썼습니다. 그리고 사용자가 날짜 필드에 데이터를 입력 할 때마다 실행되도록 설정되어 있어도 아무 것도 다운되지는 않습니다. 바라기를 이것은 누군가를 돕기를 희망합니다!

답변

2

업데이트 :momentjs이 훨씬 좋습니다.

여기 코드와 예제는 jsfiddle에서 볼 수 있습니다.

function interpretDate(stringDate){ 
    var mysqlF = "(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})"; 
    var dispF = "(\\d{1,2})[-/](\\d{1,2})[-/]((?:\\d{4})|(?:\\d{2}))"; 
    var dispNoYearF = "(\\d{1,2})[-/](\\d{1,2})"; 
    var dateFormats = "(^"+mysqlF+"$)|(^"+dispF+"$)|(^"+dispNoYearF+"$)"; 

    //Let's try to extract the data 
    data = stringDate.match(dateFormats); 
    var month = -1; 
    var day = -1; 
    var year = -1; 

    //Check to see if the verification failed 
    if (data == undefined){ 
     //Invalid date 
     return {valid: false, date: null, mysqlDate:null, displayDate: ""}; 
    } 

    //Extract the data based on the entry type 
    if (data[1] != undefined){//YYYY-MM-DD 
     month = parseInt(data[3]); 
     day = parseInt(data[4]); 
     year = parseInt(data[2]); 
    }else if (data[5] != undefined){//MM-DD-YYYY or MM-DD-YY 
     month = parseInt(data[6]); 
     day = parseInt(data[7]); 
     year = parseInt(data[8]); 
     if (year < 100){ 
      var yearString = new String(new Date().getFullYear()); 
      year = parseInt(yearString.substr(0,2) + year); 
     } 
    }else if (data[9] != undefined){//MM-DD 
     month = parseInt(data[10]); 
     day = parseInt(data[11]); 
     year = parseInt(new Date().getFullYear()); 
    } 

    //If we are here, we have three numbers, let's see if they make a real date 
    var extractedDate = new Date(year, month-1, day); 
    if (extractedDate.getFullYear() != year || extractedDate.getDate() != day || extractedDate.getMonth() != (month-1)){ 
     return {valid: false, date: null, mysqlDate:null, displayDate: ""}; 
    } 

    //We have a valid date, let's add front zeros 
    var monthFixed = month; 
    if (monthFixed < 10) monthFixed = "0"+monthFixed; 
    var dayFixed = day; 
    if (dayFixed < 10) dayFixed = "0"+dayFixed; 

    //We are done 
    return {valid: true, date: extractedDate, mysqlDate:year+"-"+monthFixed+"-"+dayFixed, displayDate: month+"/"+day+"/"+year}; 
}