Как проверить, является ли строка допустимой датой «дд / мм / гггг»? - PullRequest
10 голосов
/ 28 сентября 2011

Учитывая строку 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

Ответы [ 7 ]

13 голосов
/ 28 сентября 2011

Редактировать: точное решение ниже

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

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

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

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 и для формата гггг / мм / дд

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 ;
}
6 голосов
/ 28 сентября 2011

Попробуйте -

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

В этом вопросе больше информации - Разобрать строку DateTime в JavaScript (код в моем ответе сильно зависит от связанного вопроса)

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

EDIT

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

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/

0 голосов
/ 17 мая 2017

только для формата дд / мм / гггг

^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/]\d{4}$
0 голосов
/ 04 октября 2011

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

0 голосов
/ 28 сентября 2011

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

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

0 голосов
/ 28 сентября 2011

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

   <input type = "date" ...

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

0 голосов
/ 28 сентября 2011

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

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

примечание: это будет работать только для дд / мм / гггг

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

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