Мне нужно выполнить проверку пользователем поля даты, оно должно быть в формате ггггММдд и не должно быть больше одного года в будущем. Как бы я это сделал? В настоящее время у меня есть только грубое регулярное выражение, которого недостаточно.
function VerifyDate(source, args)
{
var regexp = /^([1-2]{1}[0-9]{1})\d{2}([0][1-9]|[1][0-2])([0][1-9]|[1-2][0-9]|[3][0-1])$/
var result = args.Value.match(regexp);
if (result) {
args.IsValid = true;
} else {
args.IsValid = false;
}
}





Возьмите регулярное выражение только для проверки формата. Вы можете оставаться простым:
^(\d{4})(\d{2})(\d{2})$
Затем проанализируйте дату и проверьте диапазон:
function VerifyDate(source, args)
{
args.IsValid = false;
var regexp = /^(\d{4})(\d{2})(\d{2})$/;
var daysInMonth = function (y, m) {return 32-new Date(y, m, 32).getDate(); };
var ma = regexp.exec(args.Value);
if (ma && ma.length == 4 && ma[2] < 12 && ma[3] <= daysInMonth(ma[1], ma[2]))
{
var diff = new Date(ma[1], ma[2], ma[3]) - new Date();
args.IsValid = diff < 31536000000; // one year = 1000ms*60*60*24*365
}
}
Ой. Я этого ожидал. Спасибо, учту.
Близко, но все равно неверно ... Есть еще как минимум 2 ошибки: Одна из них - все даты в декабре считаются недействительными.
new Date () не генерирует исключение, если месяц или день выходят за пределы допустимого диапазона. Он использует внутренний MakeDay для вычисления даты (см. Спецификация языка ECMAScript, разделы 15.9.3.1 и 15.9.1.13). Чтобы убедиться, что дата действительна в функции ниже, входные данные преобразуются в целые числа, которые преобразуются в дату, а затем части даты сравниваются с целыми числами.
Поскольку дата использует MakeDay, расчет maxDate работает, даже если сейчас - это выходной день (xxxx0229 будет yyyy0301, где yyyy = xxxx + 1)
function verifyDate(args)
{
var result=false,
match = args.Value.match(/^(\d{4})(\d{2})(\d{2})$/);
if (match && match.length === 4)
{
var year = parseInt(match[1],10),
month =parseInt(match[2],10) -1, // 0 = January
day = parseInt(match[3],10),
testDate= new Date(year,month,day),
now = new Date(),
maxDate = new Date(now.getFullYear() + 1, now.getMonth(), now. getDate()),
minDate = new Date(1800,0,1),
result = (
testDate.getFullYear() === year &&
testDate.getMonth() === month &&
testDate.getDate() === day &&
testDate >= minDate &&
testDate <= maxDate
);
}
args.IsValue = result;
return result;
}
Решение, к которому я наконец пришел, представляет собой комбинацию ваших ответов, я использовал datejs, что кажется довольно приятным. Вот моя последняя функция проверки. По какой-то причине в месяце используется индекс, основанный на 0, поэтому в .set () указано -1.
function VerifyDate(source, args)
{
args.IsValid = false;
var regexp = /^(\d{4})(\d{2})(\d{2})$/;
var m = regexp.exec(args.Value);
if (m && m.length == 4) {
try {
var result = Date.today().set({ year: Number(m[1]), month: Number(m[2]-1), day: Number(m[3]) });
if (result < Date.today().add({ years: 1 })) {
args.IsValid = true;
}
}
catch (ex) {
}
}
}
«Месяцы обозначаются целым числом в диапазоне от 0 до 11 включительно». см. раздел 15.9.1.4 в ecma-international.org/publications/files/ECMA-ST/Ecma-262.p df
Хорошо, я не знал этого до сегодняшнего дня и не видел спецификации ECMA. Но разве где-нибудь нет ссылки на javascript в более удобном для восприятия формате? Как веб-каталог? Копаться в pdf в лучшем случае обременительно.
PDF-файл является авторитетным техническим ресурсом. Более удобный ресурс - w3schools.com/jsref/default.asp
Приведенный выше код принимает 20019999, поскольку new Date () НЕ генерирует исключение в javascript, если месяц> 12 или день> daysInMonth (месяц).