0

私は次のスクリプトを継承しましたが、いくつか改善する必要があります。この関数は、許可された文字のみが入力されていることを確認し(0123456789 /)、1/1/12として入力された日付をフォーマットすると01/01/2012として再フォーマットされます。この部分は、少し調整した後でも問題なく機能します。ここで、検証をさらに一歩進めて、省略されている場合は年を追加する必要があります。つまり、ユーザーが1/1を入力した場合は、フォーマットして現在の年を追加する必要があります(例:2012年1月1日)。

ユーザー入力と必要な(作業)出力の例

  • a / a/aエラーの警告ユーザー-チェック
  • 1/2/10は、入力フィールドを2010年1月3日として読み取るように更新します
  • 01/01/12は、入力フィールドを01/01/2012として読み取るように更新します
  • 1/10/2は、入力フィールドを更新して、2002年1月10日として読み取ります。

必要な更新(上記に加えて)1/9は、入力フィールドを2012年1月9日として読み取るように更新します

現在の機能は次のとおりです(上記の機能が保持されている限り、変更、書き換えなど、何でも構いません)。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 = "0123456789/";
    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
}
4

1 に答える 1

0

異議を唱えるいくつかのポイント:

  • 有効な文字を確認する必要はありません。これは、一致する正規表現で既に必要とされているためです。本当にしたい場合は/^[\d\/]*$/.test()、そのループの代わりに使用してください。
  • 1/1 のような日付を一致させるには、一致するグループの代わりにas を使用/\d{1,2}\/\d{1,2}(\/\d{1,4})?/pて単に aを実行しますnum = obj.value.split("/")
  • 日付を検証するには、日付オブジェクトを使用した JavaScript 日付検証をご覧ください。
  • ISO 日付形式 YYYY-MM-DD も許可する必要があります。これは、によってネイティブに解析されます。Date()
于 2012-04-09T19:42:48.510 に答える