Javascript метод, чтобы убедиться, что дата действительна - PullRequest
1 голос
/ 05 августа 2011

Я пытаюсь написать метод, который проверяет, является ли дата действительной.Он передается в трех строках: месяц, день и год по порядку.Месяц должен быть от 0-11 вместо 1-12.Я проверил логику кода в Java, и он работает.is_int - это другой метод, который проверяет, состоит ли строка только из числовых символов.К сожалению, у меня возникают проблемы, с которыми я не могу разобраться.

function is_int(value) {
   for (i = 0 ; i < value.length ; i++) {
      if ((value.charAt(i) < '0') || (value.charAt(i) > '9')) return false
    }
   return true;
}

function isValidDate(value1:String, value2:String, value3:String)
{
  if (!is_int(value3)) return false;
  if (!is_int(value2)) return false;
  if (!is_int(value1)) return false;
  var v1 = parseInt(value1) + 1;
  var v2 = parseInt(value2);
  var v3 = parseInt(value3);
  if (v1 > 12 || v1 < 1) return false;
  if (v2 > 31 || v2 < 1) return false;
  if (v2 == 31) if (v1 == 2 || v1 == 4 || v1 == 6 || v1 == 9 || v1 == 11) return false;
  if (v1 != 2) return true;
  if (v2 < 29) return true;
  if (v2 == 30) return false;
  if (v3 % 400 == 0)
        return true;
  else if (v3 % 100 == 0)
        return false;
  else if (v3 % 4 == 0)
        return true;
  else
        return false; 
}

Мой первый тестер запрашивает три ввода текста и, если функция isValidDate возвращает false, отображает предупреждение.Если нет, он переходит на пустую HTML-страницу.Тем не менее, я попробовал это:

function validate() {
  if (!isValidDate("a", "a", "a")) {
  alert("wrong");
  return false;
  }
}

, и предупреждение никогда не отображалось, и оно отправлялось каждый раз.Как ни странно, это все же произошло, когда я удалил восклицательный знак перед isValidDate.Я также пытался поменять двойные кавычки на одинарные, но это тоже не решило проблему.То же самое происходит с моим тестером для is_int.Я понятия не имею, где я иду не так.

Ответы [ 5 ]

2 голосов
/ 05 августа 2011

Я знаю, что вы не просили об этом, но вот намного более правильный способ проверки дат, и он обрабатывает нечетные даты более последовательно:

function isValidDate(year, month, day) {
    var d = new Date(parseInt(year,10), parseInt(month, 10)-1, parseInt(day, 10), 0, 0, 0);
    return d.getFullYear() == year &&
           (d.getMonth()+1) == month &&
           d.getDate() == day;
}

isValidDate("2011", "08", "04"); // true
isValidDate("bob", "08", "04"); // false
isValidDate("1979", "1", "1"); // true

Скрипка с ним: http://jsfiddle.net/2WJCv/

Альтернативная ссылка только для HTML: http://pastehtml.com/view/b2se2lk9k.html

0 голосов
/ 05 августа 2011

Если вам нравится делать это длинной рукой и без использования конструктора Date, попробуйте:

function validDate(y, m, d) {
  // Days in month
  var days = [,31,28,31,30,31,30,31,31,30,31,30,31];
  // Adjust February it's a leap year
  if (m == 2 && (!(y%4) && y%100) || !(y%400)) {
    days[2] = 29;
  }
  // Check date in month
  return d <= days[+m];
}

Это может быть быстрее или нет.: -)

0 голосов
/ 05 августа 2011

Если вы удалите нелегальный javascript, он, похоже, будет работать для меня в этом jsFiddle: http://jsfiddle.net/jfriend00/ae9aC/.

В вашем коде я изменил это:

function isValidDate(value1:String, value2:String, value3:String)

к этому:

function isValidDate(value1, value2, value3)

И, jsFiddle предупреждает ложь при передаче isValidDate("a", "a", "a").

К вашему сведению, существует множество способов улучшить эту функцию. Для начала я бы посоветовал вам изменить value1, value2 и value3 на месяц, день, год и аналогично v1, v2 и v3, чтобы функция была намного более самоописываемой.

Кроме того, parseInt() всегда должно передаваться основание parseInt(str, 10) в противном случае оно будет "угадывать" основание на основе содержимого строки.

0 голосов
/ 05 августа 2011

Ваше объявление функции недопустимо:

function isValidDate(value1:String, value2:String, value3:String) {
  // your code here
}

Параметры функций JavaScript и объявления переменных не имеют типов, поэтому вам нужно сказать:

function isValidDate(value1, value2, value3) {
  // your code here
}

(Несвязанное предложение:Назовите свои параметры и переменные более осмысленно. Если вы ожидаете, что месяц, день, год, почему бы не назвать их так, особенно когда речь идет о датах, когда многие страны обычно говорят день, месяц, год, а не месяц, день, год.

Еще одно несвязанное предложение: посмотрите на регулярные выражения.)

0 голосов
/ 05 августа 2011

Я думаю, что ваша проблема в функции isValidDate (): должно быть function isValidDate(value1, value2, value3) Я получил предупреждение, используя это. Надеюсь, это поможет! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...