2012-04-09 2 views
0

Я унаследовал следующий скрипт, и некоторые из них должны быть улучшены. Функция проверяет, что введены только допустимые символы (/), а затем форматирует дату, введенную как 1/1/12, будет переформатирована как 01/01/2012. Эта часть прекрасно работает после небольшой настройки. Теперь мне нужно сделать еще один шаг проверки и добавить год, если он опущен, если пользователь вводит 1/1, его нужно отформатировать и добавить текущий год (например, 01/01/2012).Улучшение валидации даты JS

Пример данных, вводимых пользователем, и необходимые (рабочие) выходы

  • а/а/а предупреждение пользователю ошибки - проверить
  • 1/2/10 обновления поля ввода, чтобы читать как 01.03.2010
  • 01/01/12 обновляет поле ввода, чтобы читать как 01/01/2012
  • 1/10/2 обновляет поле ввода, чтобы читать как 01/10/2002

желаемого обновления (в дополнении выше) 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

Некоторые точки объекта:

  • Вы не должны проверить допустимых символов, потому что ваш матч регулярное_выражение уже нуждается в них. Если вы действительно этого хотите, используйте /^[\d\/]*$/.test() вместо этого цикла.
  • Чтобы соответствовать даты, как 1/1, использовать /\d{1,2}\/\d{1,2}(\/\d{1,4})?/ как p и просто сделать 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

Смежные вопросы