2014-01-06 4 views
2

Я пытаюсь написать валидатор даты, который примет дату, введенную в виде строки длиной 8 в формате ddmmyyyy. Он должен проверить его на все основы для допустимой даты и вернуть в результате как true, так и false.Создание валидатора даты

Я не могу использовать дополнительную библиотеку, такую ​​как момент, и я не могу использовать регулярные выражения (это не домашнее задание, мне просто говорят работать в рамках этих ограничений).

Буду признателен, если люди скажут мне, что случилось с тем, что у меня внизу!

function isValidDate(i) { 

    if (i.length == 8) { 
     var dd = i.substring(0, 2); 
     var mm = i.substring(2, 4); 
     var yyyy = i.substring(4, 7); 
     var day = parseInt(dd,10); 
     var month = parseInt(mm,10); 
     var year = parseInt(yyyy,10); 
     if (year % 4 != 0 && day = 29 && month = 02) { 
      return false; 
     } else if (day > 31) { 
      return false; 
     } else if (month > 12) { 
      return false; 
     } else { 
      return true; 
     } 
    } else { 
     return false; 
    } 
    return true; 
} 
+3

После того, как вы разделили строку на переменные 'yyyy',' mm', 'dd', вы можете создать новый объект Date из этих данных и проверить, имеют ли объекты Date те же переменные, которые были наложены на создание объекта Date. – Epsil0neR

+1

Ваша функция позволяет день = 31 в течение месяцев, которые имеют только 30 дней – Barmar

+2

Это также разрешает 30 февраля и 31 февраля, но не 29 февраля, кроме как в високосные годы (но он не знает правила века за високосные годы). – Barmar

ответ

1

Вы можете использовать такую ​​функцию. Эта функция проверяет, являются ли аргументы аргументами действительными целыми числами (путем разбора их целых чисел и проверки, если они не являются NaN), а затем проверяет, действительны ли месяц и дни, но не проверяет год, потому что год может быть любым номером :)

function dateValidation(year, month, day){ 
    // Check arguments 
    year = parseInt(year); 
    if (isNaN(year)) return false; 

    month = parseInt(month); 
    if (isNaN(month)) return false; 

    day = parseInt(day); 
    if (isNaN(day)) return false; 

    // Check if month is correct 
    if (!(month >= 1 && month <= 12)) return false; 

    switch (month){ 
     case 1: //January 
     case 3: // March 
     case 5: // May 
     case 7: // July 
     case 8: // Augyst 
     case 10:// October 
     case 12:// December 
      return (day > 0 && day <= 31); // Maximum days is 31 in these months 
      break 
     case 4: // April 
     case 6: // June 
     case 9: // September 
     case 11:// November 
      return (day > 0 && day <= 30); // Maximum days is 30 in these months 
      break 
     case 2: // February 
      if (year % 4 != 0){ 
       return (day > 0 && day <= 28); 
      } else { 
       return (day > 0 && day <= 29); 
      break 
      } 
     default: 
      return false; 
    } 
} 
+1

Благодарим вас за это, использование корпусов очень полезно. – user3165009

+0

Вы также можете проголосовать за этот ответ как полезный (проголосовать) – Epsil0neR

+0

Не с моей репутацией я не могу! – user3165009

1

Ваше первое недоразумение заключается в использовании = вместо == в сравнении.

Следующим является использование 02 как целое число, которое не возможно, потому что ParseInt бы 2 из 02 так просто сравнить == 2

if (year % 4 != 0 && day == 29 && month == 2) { 

Уступка всегда возвращает истину в, если заявление и год % 4 не равно 0 в 2014 году, поэтому вы всегда будете «возвращать ложь» до 2016 года.

+0

Спасибо, извиниться за такие глупые ошибки. – user3165009

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