1

ユーザーが入力した日付を取得して次のことを行う便利な方法を探していました。

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 形式と通常の形式を返す理由は、単純に便宜上のものです。私の Web アプリでは、フィールドに表示するための一般的な形式と、データを保存するときにサーバーに送信するための mysQL 形式が必要です。

コードは私の答えの下に示されています。コードを最適化する方法はあると思いますが、読みやすくするために分割して記述しました。また、ユーザーが日付フィールドにデータを入力するたびに実行するように設定されていたとしても、問題は発生しません。うまくいけば、これは誰かを助けます!

4

1 に答える 1

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};
}
于 2013-04-06T17:02:09.517 に答える