Как проверить, является ли строка легальной датой "dd/mm/yyyy"?

С учетом строки str, как я могу проверить, находится ли она в формате dd/mm/yyyy и содержит дату регистрации?

Некоторые примеры:

bla bla      // false
14/09/2011   //         true
09/14/2011   // false
14/9/2011    // false
1/09/2011    // false
14/09/11     // false
14.09.2011   // false
14/00/2011   // false
29/02/2011   // false
14/09/9999   //         true

Ответ 1

Изменить: точное решение ниже

Вы можете сделать что-то подобное, но с более точным алгоритмом для проверки дня:

function testDate(str) {
  var t = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
  if(t === null)
    return false;
  var d = +t[1], m = +t[2], y = +t[3];

  // Below should be a more acurate algorithm
  if(m >= 1 && m <= 12 && d >= 1 && d <= 31) {
    return true;  
  }

  return false;
}

http://jsfiddle.net/aMWtj/

Дата проверки alg.: http://www.eee.hiflyers.co.uk/ProgPrac/DateValidation-algorithm.pdf

Точное решение:, которая возвращает синтаксическую дату или значение null, в зависимости от ваших требований.

function parseDate(str) {
  var t = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
  if(t !== null){
    var d = +t[1], m = +t[2], y = +t[3];
    var date = new Date(y, m - 1, d);
    if(date.getFullYear() === y && date.getMonth() === m - 1) {
      return date;   
    }
  }

  return null;
}

http://jsfiddle.net/aMWtj/2/

Если вам нужна функция для возврата true/false и для формата yyyy/mm/dd

function IsValidDate(pText) {
    var isValid = false ;
    var t = pText.match(/^(\d{4})\/(\d{2})\/(\d{2})$/);

    if (t !== null) {
        var y = +t[1], m = +t[2], d = +t[3];
        var date = new Date(y, m - 1, d);

        isValid = (date.getFullYear() === y && date.getMonth() === m - 1) ;
    }

    return isValid ;
}

Ответ 2

Попробуйте -

   var strDate = '12/03/2011';
   var dateParts = strDate.split("/");
   var date = new Date(dateParts[2], (dateParts[1] - 1) ,dateParts[0]);

Там больше информации в этом вопросе - Строка Parse DateTime в JavaScript (на мой ответ в основном влияет связанный вопрос)

Демо - http://jsfiddle.net/xW2p8/

ИЗМЕНИТЬ

Обновлен ответ, попробуйте -

function isValidDate(strDate) {
    if (strDate.length != 10) return false;
    var dateParts = strDate.split("/");
    var date = new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]);
    if (date.getDate() == dateParts[0] && date.getMonth() == (dateParts[1] - 1) && date.getFullYear() == dateParts[2]) {
        return true;
    }
    else return false;
}

Эта функция передает все тестовые примеры. Насколько мне известно, Адам Юрчик хорошо написал ответ, прежде чем исправил свой первоначальный неправильный ответ. Он заслуживает этого.

Демо - http://jsfiddle.net/2r6eX/1/

Ответ 3

вы можете использовать регулярный exp для подтверждения даты. попробуйте вот так:

  re = /^\d{1,2}\/\d{1,2}\/\d{4}$/; 
if(form.mydate.value != '' && !form.mydate.value.match(re))
  //do something here

Примечание: это будет работать только для dd/mm/yyyy

для точного соответствия вашего требования используйте

 re = /^\d{2}\/\d{2}\/\d{4}$/; 

Ответ 4

Я собираюсь ответить на другой вопрос, так как Миша Морошко уже хорошо ответил: используйте HTML5. То есть, исходя из предположения, что указанные строки возникают, когда пользователь вводит через веб-браузер, я предлагаю, чтобы записи принимались как

   <input type = "date" ...

Я понимаю, что не все браузеры, которые, вероятно, будут использоваться, будут интерпретировать "дату" таким образом, чтобы строго соблюдать силу. Разумеется, правильная вещь, безусловно, будет улучшаться с течением времени и может быть достаточно хорошей в конкретном контексте, даже теперь просто для устранения необходимости проверки строки даты после факта.

Ответ 5

Лично я считаю, что лучшим решением будет изменение пользовательского интерфейса для использования выпадающих списков для месяца и, возможно, дневных выборов.

Попытка выяснить, есть ли 1/2/2001 2 января или 1 февраля, основываясь исключительно на этой входной строке, невозможно.

Ответ 6

Недавнее открытие: вы можете использовать date.js lib, добавляет функцию Date.parseExact, чтобы вы могли просто сделать Date.parseExact(dateString,"dd/MM/yyyy"). Он не работает, когда месяц 00, но его все еще полезно.

Ответ 7

только для формата dd/mm/yyyy

^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/]\d{4}$