2012-04-09 10 views
0

私は以下のスクリプトを継承しました。いくつかのスクリプトを改善する必要があります。この関数は、許可された文字(/)のみが入力されていることを確認し、1/1/12として入力された日付をフォーマットすると、01/01/2012として再フォーマットされます。この部分はちょっと微調整してもうまく動作します。今、検証をさらに進めて、ユーザーが1/1を入力し、フォーマットされ、現在の年が追加される必要があることを意味する、省略された場合は年を追加する必要があります(たとえば、01/01/2012)。JS日付検証の強化

ユーザ入力および必要な(ワーキング)出力の例

  • //エラーのアラートユーザ - チェック
  • 1/2/10は2010年1月3日として読み取るための入力フィールドを更新します
  • 01/01/12
  • は、さらに(2002年1月10日

所望の更新として読み取るために2012年1月1日

  • 1/10/2アップデート入力フィールドとして読み取るための入力フィールドを更新します 1/9更新する入力フィールド01/09/2012

    ここに現在の機能があります(上記の機能が保持されている限り、変更、書き換え可能です)。 jQuery 1.7ライブラリが使用されており、実装できます。オブジェクトへ

    function ValidateDate(obj) 
    { 
    /************************************************ 
    DESCRIPTION: Validates that a string contains only 
        valid dates with 2 digit month, 2 digit day, 
        4 digit year. Date separator has to be/
        Uses combination of regular expressions and 
        string parsing to validate date. 
        Ex. mm/dd/yyyy 
    
    PARAMETERS: 
        ValidateDate(strValue) - String to be tested for validity 
    
    RETURNS: 
        True if valid, otherwise false. 
    
    REMARKS: 
        Avoids some of the limitations of the Date.parse() 
        method such as the date separator character. 
    *************************************************/ 
        var checkOK = "/"; 
        var checkStr = obj.value; 
        var allValid = true; 
        var p = /(\d{1,2})\/(\d{1,2})\/(\d{1,4})/; 
        var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/; 
        // check to see if valid characters were used  
        for (i = 0; i < checkStr.length; i++) 
        { 
         ch = checkStr.charAt(i); 
         for (j = 0; j < checkOK.length; j++) 
          if (ch == checkOK.charAt(j)) 
          break; 
         if (j == checkOK.length) 
         { 
          allValid = false; 
          break; 
         } 
        } 
        if (!allValid) 
        { 
         alert("Please use only a combination of " + checkOK + "\'s charaters in the date field. Dates should be entered in the format of mm/dd/yyyy."); 
         setTimeout((function() { obj.select() }), 0); 
         return (false); 
        }  
        // converts to mm/dd/yyyy format 
        if (!obj.value.match(p)) return; 
        num=new Array(); 
        num=obj.value.match(p); 
        if (num[1].length == 1) num[1]="0" + num[1]; 
        if (num[2].length == 1) num[2]="0" + num[2]; 
        if (num[3].length == 1) num[3]="200" + num[3]; 
        if (num[3].length == 2) num[3]="20" + num[3]; 
        obj.value= num[1] + "/" + num[2] + "/" + num[3]; 
        //check to see if in correct format 
        if(!objRegExp.test(obj.value)) 
        { 
         alert('The date entered is not properly formatted.'); 
         return false; //doesn't match pattern, bad date 
        } 
        else{ 
         var arrayDate = obj.value.split(RegExp.$1); //split date into month, day, year 
         var intDay = parseInt(arrayDate[1],10); 
         var intYear = parseInt(arrayDate[2],10); 
         var intMonth = parseInt(arrayDate[0],10); 
        //check for valid month 
        if(intMonth > 12 || intMonth < 1) { 
         alert('The date entered is invalid'); 
         return false; 
        } 
    
        //create a lookup for months not equal to Feb. 
        var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31, 
             '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31} 
    
        //check if month value and day value agree 
        if(arrayLookup[arrayDate[0]] != null) { 
         if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0) 
         return true; //found in lookup table, good date 
        } 
    
        //check for February 
        var booLeapYear = (intYear % 4 == 0 && (intYear % 100 != 0 || intYear % 400 == 0)); 
        if(((booLeapYear && intDay <= 29) || (!booLeapYear && intDay <=28)) && intDay !=0) 
         return true; //Feb. had valid number of days 
        } 
        alert(obj.value + ' is not a valid date.'); 
        // return false; //any other values, bad date 
    } 
    
  • +0

    問題は何ですか? –

    +0

    @VladMinaev - このスクリプトを修正して、必要な出力を得る方法を教えてください。 * a/a /エラーアラートのユーザー - チェック * 1/2/10は、入力フィールドを01/03/2010として更新します。 * 01/01/12は、入力フィールドを01/01/2012として更新します。 * 1/10/2は01/10/2002'と読むために入力フィールドを更新します。このスクリプトでは、新しいスクリプトを使用できます。 – HPWD

    答えて

    0

    いくつかのポイント:

    • あなたのマッチregexpはすでにそれらを必要とするので、あなたは、有効な文字を確認する必要はありません。本当にしたい場合は、そのループの代わりに/^[\d\/]*$/.test()を使用してください。
    • pとして/\d{1,2}\/\d{1,2}(\/\d{1,4})?/を使用し、1月1日のような日付と一致し、ただ、日付を検証するために一致するグループ
    • の代わりに num = obj.value.split("/")を行います。また、許可する必要があり javascript date validation using date object
    • を見ているために、ISO日付書式YYYY-MM -DD。ネイティブに解析されます。Date()
    +0

    これは良い点ですが、正規表現を使用した場合、私たちはキャッチされていない文字を見ていました。クライアントは、同じフォーマットを使用しているチームをすべて望んでいます。特に、別のソースから日付をコピーして貼り付けることになっているからです。彼らのチームリーダーは、タイプミスの可能性を減らすために日付を入力することを望んでいません(コピーして貼り付ける場合、文字は表示されませんが、私は脱出します)。 – HPWD

    +0

    他のソースから日付を抽出するには、C&P Web Guiは私が考えるベストソリューションではありません... – Bergi

    +0

    "キャッチされていない文字"とはどういう意味ですか? – Bergi