2013-04-06 47 views
1

我一直在尋找把用戶輸入的日期並執行以下操作的簡便方法:解釋用戶在JavaScript中輸入的日期

1)確定輸入的日期是有效的,如果它是有效的,回報與對象:

2)一個JavaScript Date對象

3)中的MySQL格式進行格式化的日期(YYYY-MM-DD)

4)的日期在典型格式(MM-DD-格式化YYYY)

最後我寫了自己的函數,使用正則表達式,可以處理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}; 
}