segunda-feira, 15 de abril de 2013

Javascript: Validar Data no Formato DD/MM/YYYY

Sempre que ao pesquisar sobre uma validação de data encontrava muito código para pouco resultado, e após algum estudo resolvi criar uma validação feita por mim, utilizei um conceito muito simples: se após converter o valor para o tipo Data e após a conversão a data ainda for a mesma, quer dizer que a conversão foi um sucesso, então sabemos que a data é válida.


//-----------------------------------------------------------------
// Entrada DD/MM/AAAA
//-----------------------------------------------------------------
function fctValidaData(obj)
{
    var data = obj.value;
    var dia = data.substring(0,2)
    var mes = data.substring(3,5)
    var ano = data.substring(6,10)

    //Criando um objeto Date usando os valores ano, mes e dia.
    var novaData = new Date(ano,(mes-1),dia);

    var mesmoDia = parseInt(dia,10) == parseInt(novaData.getDate());
    var mesmoMes = parseInt(mes,10) == parseInt(novaData.getMonth())+1;
    var mesmoAno = parseInt(ano) == parseInt(novaData.getFullYear());

    if (!((mesmoDia) && (mesmoMes) && (mesmoAno)))
    {
        alert('Data informada é inválida!');   
        obj.focus();    
        return false;
    }  
    return true;
}

Segue abaixo um exemplo de como utilizar a function:


<body>

Data: 
<input type='text' id='txtDt' name='txtDt' onblur='fctValidaData(this);'/>

</body>

20 comentários:

  1. Muito legal seu código funciona perfeitamente!!! Você saberia me dizer como faço para entrada ano-mes-dia???

    ResponderExcluir
    Respostas
    1. Oi, tudo bem, então, para este código não é possível pois é feito de forma genérica, podemos perceber que dentro dele não faz menção a nenhum nome de input...
      Mas para resolver seu problema é simples sem fazer de forma genérica você vai ter que chamar os inputs de dia, mês e ano dentro do código substituindo....
      var dia = data.substring(0,2)
      var mes = data.substring(3,5)
      var ano = data.substring(6,10)

      por
      var dia = document.getElementById('inputDia').value;
      var mes = document.getElementById('inputMes').value;
      var ano = document.getElementById('inputAno').value;

      todos os 3 inputs devem conter o onblur..... sem passagem de parametros
      espero que tenha ajudado
      Abraço

      Excluir
    2. Não sei se foi isso que a gracy perguntou...
      Eu usei este script para aaaa-mm-dd alterando
      var dia = data.substring(0,2)
      var mes = data.substring(3,5)
      var ano = data.substring(6,10)
      por
      var ano = data.substring(0,4)
      var mes = data.substring(5,7)
      var dia = data.substring(8,10)

      Excluir
  2. Perfeito amigão, parabéns pelo belo trabalho, me ajudou muito.

    ResponderExcluir
    Respostas
    1. Valeu, espero em breve poder estar contribuindo mais com javascript, apesar da maioria do conteúdo publicado for de banco de dados.

      Excluir
  3. Não faz validação de ano bisexto! Tem uma validacao boa em http://codigofonte.uol.com.br/codigos/validacao-completa-de-datas-em-javascript

    ResponderExcluir
    Respostas
    1. Oi tudo bem,
      Gostaria de saber qual dado informado falhou na validação do bisexto, pois este código prevê anos bisexto sim.

      Olhei o link que você postou e achei interessante, mas agora quero consertar falhas no meu caso existam.

      Obrigado.

      Excluir
    2. Tá validando bisexto sim! O colega pode ter colocado uma data inválida!

      Excluir
  4. amigo esta dando data incorreta para o dia 19/10/2014

    ResponderExcluir
  5. Bah cara no meu fica dando mensagem da mensagem errada e não deixa eu mexer mais no site

    ResponderExcluir
    Respostas
    1. Tem que retirar a linda de código obj.focus(); então funciona!

      Excluir
  6. Este comentário foi removido pelo autor.

    ResponderExcluir
  7. Boa noite, gostaria de validar apenas o mês e o ano, se o mês for maior de 12 retorna erro e comparar o ano, se for menor que o ano atual retornar erro tb, dados vindos de um input com máscara mm/aaaa
    è possível? Obrigado

    ResponderExcluir
  8. o código no começo aparentemente funcionou corretamente, mas no momento em que digitei uma data, por exemplo, assim: 12/03/200, ele validou na mesma sendo que a data esta incorreta.

    ResponderExcluir
  9. Olá,
    O código funciona direitinho. Top demais, no entanto o obj.focus() não deu certo. Quando há erros, exibe o alert, mas não volta para o campo. Pode me ajudar?

    ResponderExcluir