Атрибут pattern при вводе неправильной даты

Нужно выбор даты только за период до 31.12.2020. Т.е. с 01.01.2021 уже должно запрещать выполнять действие

<td><form:label path="dateBegin"><spring:message code="label.dateBegin" /></form:label>
<form:input id="dateBeginCountDetail_exp" path="dateBegin" class='reportParam' pattern="^[^2021]*$" title="Только до 31.12.2020"/></td>


    $( "#dateBeginCountDetail_exp" ).datepicker({dateFormat:'dd.mm.yy'});
    $('#dateBeginCountDetail_exp').attr('autocomplete','off');

Ответы (1 шт):

Автор решения: entithat

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

^(?:3[01]|0[1-9]|[12][0-9]|)\.(?:0[1-9]|1[1-2])\.(?:[01][0-9]{3}|20([01][0-9]|20))$

(?:3[01]|0[1-9]|[12][0-9]|) отвечает за число, т.е. от 01 до 31.
(?:0[1-9]|1[1-2]) отвечает за месяц, т.е. от 01 до 12.
(?:[01][0-9]{3}|20([01][0-9]|20)) отвечает за любой год в формате YYYY, кроме 2021+.

P.S. Правда неучёл, что в некоторых месяцах может и не быть 31 дня (а в феврале и 29+)

document.querySelector('input').onchange = (e) => console.log(e.target.checkValidity());
<input pattern="^(?:3[01]|0[1-9]|[12][0-9]|)\.(?:0[1-9]|1[1-2])\.(?:[01][0-9]{3}|20([01][0-9]|20))$" placeholder='Press enter to check validity'>

→ Ссылка