Как проверить дату в этом формате (yyyy-mm-dd) с помощью jquery?

Я пытаюсь проверить дату в этом формате: (yyyy-mm-dd). Я нашел это решение, но оно не в том формате, в котором я нуждаюсь, как в: (мм/дд/гггг).

Вот ссылка на это решение: http://jsfiddle.net/ravi1989/EywSP/848/

Мой код ниже:

function isDate(txtDate)
{
    var currVal = txtDate;
    if(currVal == '')
        return false;

    var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/; //Declare Regex
    var dtArray = currVal.match(rxDatePattern); // is format OK?

    if (dtArray == null) 
        return false;

    //Checks for mm/dd/yyyy format.
    dtMonth = dtArray[1];
    dtDay= dtArray[3];
    dtYear = dtArray[5];        

    if (dtMonth < 1 || dtMonth > 12) 
        return false;
    else if (dtDay < 1 || dtDay> 31) 
        return false;
    else if ((dtMonth==4 || dtMonth==6 || dtMonth==9 || dtMonth==11) && dtDay ==31) 
        return false;
    else if (dtMonth == 2) 
    {
        var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
        if (dtDay> 29 || (dtDay ==29 && !isleap)) 
                return false;
    }
    return true;
}

Какой шаблон регулярного выражения я могу использовать для этого, который будет учитывать недопустимые даты и високосные годы?

Ответ 1

Я немного расширил функцию isValidDate, опубликованную Торбином выше (с помощью регулярных выражений). Мы используем регулярные выражения для проверки формата (чтобы не дать нам получить другой формат, который был бы действителен для даты). После этой проверки мы фактически запускаем его через конструктор Date и возвращаем true или false, если он действителен в этом формате. Если это не правильная дата, мы получим false из этой функции.

function isValidDate(dateString) {
  var regEx = /^\d{4}-\d{2}-\d{2}$/;
  if(!dateString.match(regEx)) return false;  // Invalid format
  var d = new Date(dateString);
  var dNum = d.getTime();
  if(!dNum && dNum !== 0) return false; // NaN value, Invalid date
  return d.toISOString().slice(0,10) === dateString;
}


/* Example Uses */
console.log(isValidDate("0000-00-00"));  // false
console.log(isValidDate("2015-01-40"));  // false
console.log(isValidDate("2016-11-25"));  // true
console.log(isValidDate("1970-01-01"));  // true = epoch
console.log(isValidDate("2016-02-29"));  // true = leap day
console.log(isValidDate("2013-02-29"));  // false = not leap day

Ответ 2

Вы также можете просто использовать регулярные выражения, чтобы выполнить немного более простую работу, если этого достаточно для вас (например, как показано в [1]).

Они встроены в JavaScript, поэтому вы можете использовать их без каких-либо библиотек.

function isValidDate(dateString) {
  var regEx = /^\d{4}-\d{2}-\d{2}$/;
  return dateString.match(regEx) != null;
}

будет функцией, чтобы проверить, является ли данная строка четырьмя числами - двумя числами - двумя числами (почти гггг-мм-дд). Но вы можете сделать еще больше с более сложными выражениями, например, check [2].

isValidDate("23-03-2012") // false
isValidDate("1987-12-24") // true
isValidDate("22-03-1981") // false
isValidDate("0000-00-00") // true

Ответ 3

Поскольку jQuery помечен, здесь можно легко и удобно использовать поле, которое должно быть датой (вам понадобится плагин проверки jQuery):

HTML

<form id="frm">
<input id="date_creation" name="date_creation" type="text" />
</form>

JQuery

$('#frm').validate({
  rules: {
    date_creation: {
      required: true,
      date: true
    }
  }
});

DEMO + Пример


ОБНОВЛЕНИЕ: После некоторого копания я не обнаружил доказательств наличия готового параметра для установки определенного формата даты.

Однако вы можете подключить регулярное выражение по вашему выбору в пользовательском правиле:)

$.validator.addMethod(
    "myDateFormat",
    function(value, element) {
        // yyyy-mm-dd
        var re = /^\d{4}-\d{1,2}-\d{1,2}$/;

        // valid if optional and empty OR if it passes the regex test
        return (this.optional(element) && value=="") || re.test(value);
    }
);

$('#frm').validate({
  rules: {
    date_creation: {
      // not optional
      required: true,
      // valid date
      date: true
    }
  }
});

Это новое правило будет означать обновление вашей разметки:

<input id="date_creation" name="date_creation" type="text" class="myDateFormat" />

Ответ 4

попробуйте Здесь приведена демонстрация:

$(function() {
    $('#btnSubmit').bind('click', function(){
        var txtVal =  $('#txtDate').val();
        if(isDate(txtVal))
            alert('Valid Date');
        else
            alert('Invalid Date');
    });

function isDate(txtDate)
{
    var currVal = txtDate;
    if(currVal == '')
        return false;

    var rxDatePattern = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/; //Declare Regex
    var dtArray = currVal.match(rxDatePattern); // is format OK?

    if (dtArray == null) 
        return false;

    //Checks for mm/dd/yyyy format.
    dtMonth = dtArray[3];
    dtDay= dtArray[5];
    dtYear = dtArray[1];        

    if (dtMonth < 1 || dtMonth > 12) 
        return false;
    else if (dtDay < 1 || dtDay> 31) 
        return false;
    else if ((dtMonth==4 || dtMonth==6 || dtMonth==9 || dtMonth==11) && dtDay ==31) 
        return false;
    else if (dtMonth == 2) 
    {
        var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
        if (dtDay> 29 || (dtDay ==29 && !isleap)) 
                return false;
    }
    return true;
}

});

измененное регулярное выражение:

var rxDatePattern = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/; //Declare Regex

Ответ 5

Я рекомендую использовать Использование плагина проверки jquery и jquery ui date picker

jQuery.validator.addMethod("customDateValidator", function(value, element) {
// dd-mm-yyyy
   var re = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$/ ; 
   if (! re.test(value) ) return false
   // parseDate throws exception if the value is invalid
   try{jQuery.datepicker.parseDate( 'dd-mm-yy', value);return true ;}
   catch(e){return false;} 
   },
   "Please enter a valid date format dd-mm-yyyy"
);

this.ui.form.validate({
    debug: true,
    rules : {
    title : { required : true, minlength: 4 }, 
    date : { required: true, customDateValidator: true }
    }
}) ;

С помощью Jquery и выбора даты просто создайте функцию с

// dd-mm-yyyy
var re = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$/ ; 
 if (! re.test(value) ) return false
// parseDate throws exception if the value is invalid
try{jQuery.datepicker.parseDate( 'dd-mm-yy', value);return true ;}
catch(e){return false;}

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

// dd-mm-yyyy
var re = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$/ ; 
return re.test(value) 

Конечно, формат даты должен быть вашего региона

Ответ 6

Здесь JavaScript rejex для формата YYYY-MM-DD

/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/

Ответ 7

Переставьте регулярное выражение на:

/^(\d{4})([\/-])(\d{1,2})\2(\d{1,2})$/

Я сделал немного больше, чем просто переупорядочил термины, я также сделал так, чтобы он не принимал "сломанные" даты, такие как yyyy-mm/dd.

После этого вам нужно настроить переменные dtMonth и т.д. следующим образом:

dtYear = dtArray[1];
dtMonth = dtArray[3];
dtDay = dtArray[4];

После этого код должен работать нормально.

Ответ 8

Рабочий демонстрационный скрипт здесь Демо

Изменена ваша функция проверки на

function isDate(txtDate)
{
return txtDate.match(/^d\d?\/\d\d?\/\d\d\d\d$/);
}

Ответ 9

Просто используйте конструктор Date для сравнения со строковым вводом:

function isDate(str) {
  return 'string' === typeof str && (dt = new Date(str)) && !isNaN(dt) && str === dt.toISOString().substr(0, 10);
}

console.log(isDate("2018-08-09"));
console.log(isDate("2008-23-03"));
console.log(isDate("0000-00-00"));
console.log(isDate("2002-02-29"));
console.log(isDate("2004-02-29"));

Ответ 10

Вы можете использовать его для YYYY-MM-DD. Он проверяет, действительно ли это действительная дата и что значение не равно NULL. Он возвращает TRUE, если каждый из них проверяет правильность или FALSE, если что-то недействительно. Это не становится легче, чем это!

function validateDate(date) {
    var matches = /^(\d{4})[-\/](\d{2})[-\/](\d{2})$/.exec(date);
    if (matches == null) return false;
    var d = matches[3];
    var m = matches[2] - 1;
    var y = matches[1] ;
    var composedDate = new Date(y, m, d);
    return composedDate.getDate() == d &&
            composedDate.getMonth() == m &&
            composedDate.getFullYear() == y;
}

Помните, что месяцы нужно вычитать следующим образом: var m = matches[2] - 1; иначе экземпляр new Date() не будет правильно выполнен.