Подтвердите дату в JavaScript - PullRequest
       12

Подтвердите дату в JavaScript

1 голос
/ 19 января 2009

Мне нужно сделать пользовательскую проверку поля даты, оно должно быть в формате ггггМдд и не должно быть более одного года в будущем Как бы я поступил так? В настоящее время у меня есть только грубое регулярное выражение, которого недостаточно.

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;
    }       
}

Ответы [ 3 ]

5 голосов
/ 19 января 2009

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

^(\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
  }
}
1 голос
/ 19 января 2009

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;   
}
0 голосов
/ 19 января 2009

Решение, которое я наконец-то выбрал - это комбинация ваших ответов, я использовал datejs, что выглядит довольно неплохо. Вот моя последняя функция проверки. По какой-то причине месяц, похоже, использует индекс, основанный на 0, поэтому он говорит -1 в .set ().

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) {
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...