2013-04-06 45 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}; 
}