Validação de formato e conteúdo de data com jQuery

Passei algum tempo tentando escrever uma expressão regular para verificar a validade (tanto em formato quanto em dias) de uma data de versão que utilizo. O problema é que a expressão regular só me permite verificar o formato da data.

Assim, sempre que o usuário digitava uma data errada, eu não conseguia validar. Alguns minutos procurando no Google, encontrei no StackOverflow (e já perdi o link) uma função que faz esta verificação – abaixo:

function isDate(str) {
    var parms = str.split(/[\.\-\/]/);
    var yyyy = parseInt(parms[2],10);
    var mm   = parseInt(parms[1],10);
    var dd   = parseInt(parms[0],10);
    var date = new Date(yyyy,mm-1,dd,0,0,0,0);
    return mm === (date.getMonth()+1) && dd === date.getDate() && ((yyyy === date.getFullYear()) && yyyy.toString().length === 4);
}

Ainda assim foi preciso fazer uma leve correção. Considerando que estamos (hoje) no ano 2015, quando um usuário digitasse uma data com três dígitos – por exemplo 201 – o retorno da função era True. Afinal, 201 é uma data válida, após 2015.

Bastou adicionar a verificação de tamanho do ano (obrigando a ter 4 caracteres) e tudo funcionou corretamente. Se a função for aplicada no evento input do objeto, é possível validar o conteúdo conforme o usuário vai digitando.

Para exemplificar, o escopo completo da função de verificação de data, de acordo com o objeto, ficou assim:

function checkProgramVersion(obj) {
    if (!isDate(obj.value)) {
        $(obj).parent().addClass('has-error');
        $('button[name=commit]')
            .addClass('disabled')
            .html("  Corrija os valores em vermelho!");

    } else {
        $(obj).parent().removeClass('has-error');
        $('button[name=commit]')
            .removeClass('disabled')
            .html("  Salvar chamado");
    }


    function isDate(str) {
        var parms = str.split(/[\.\-\/]/);
        var yyyy = parseInt(parms[2],10);
        var mm   = parseInt(parms[1],10);
        var dd   = parseInt(parms[0],10);
        var date = new Date(yyyy,mm-1,dd,0,0,0,0);
        return mm === (date.getMonth()+1) && dd === date.getDate() && ((yyyy === date.getFullYear()) && yyyy.toString().length === 4);
    }
}
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s