Função para validar data em JavaScript

No JavaScript, não existe um método nativo para validar uma data. Portanto, é necessário criar uma função personalizada para verificar o dia, mês e ano da data informada. Logo abaixo, temos o código de uma função de validação para datas, incluindo comentários descritivos e seguindo boas práticas de programação:

function validaData (valor) {
  // Verifica se a entrada é uma string
  if (typeof valor !== 'string') {
    return false
  }

  // Verifica formado da data
  if (!/^\d{2}\/\d{2}\/\d{4}$/.test(valor)) {
    return false
  }

  // Divide a data para o objeto "data"
  const partesData = valor.split('/')
  const data = { 
    dia: partesData[0], 
    mes: partesData[1], 
    ano: partesData[2] 
  }
  
  // Converte strings em número
  const dia = parseInt(data.dia)
  const mes = parseInt(data.mes)
  const ano = parseInt(data.ano)
  
  // Dias de cada mês, incluindo ajuste para ano bissexto
  const diasNoMes = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]

  // Atualiza os dias do mês de fevereiro para ano bisexto
  if (ano % 400 === 0 || ano % 4 === 0 && ano % 100 !== 0) {
    diasNoMes[2] = 29
  }
  
  // Regras de validação:
  // Mês deve estar entre 1 e 12, e o dia deve ser maior que zero
  if (mes < 1 || mes > 12 || dia < 1) {
    return false
  }
  // Valida número de dias do mês
  else if (dia > diasNoMes[mes]) {
    return false
  }
  
  // Passou nas validações
  return true
}
view raw validaData.js hosted with ❤ by GitHub

Testando a função de validação:

Abaixo, podemos testar nossa função de validação de data. Experimente informar alguns números com e sem formação, pois a própria função, no momento de validar, verifica o formato da data. Tente alguns números para ver o que acontece:

Como funciona a função de validar data?

Primeiramente, a função validaData() verifica se o argumento valor recebido foi fornecido como uma string. Caso não seja, a função retorna false, indicando que a validação falhou:

if (typeof valor !== 'string') {
  return false
}

A próxima etapa da validação utiliza uma expressão regular para verificar se o formato da data fornecida é válido. A expressão regular /^\d{2}\/\d{2}\/\d{4}$/ especifica o padrão da data no formato "dd/mm/aaaa":

  • ^: Indica o início da string.
  • \d{2}: Indica dois dígitos (representando o dia).
  • /: Indica o caractere de barra (/) que separa o dia do mês.
  • \d{2}: Indica dois dígitos após a barra (representando o mês).
  • /: outro caractere de barra (/) que separa o mês do ano.
  • \d{4}: quatro dígitos (representando o ano).
  • $: final da string.

Se a data não corresponder ao padrão especificado na expressão regular, a função retorna false, indicando que a validação falhou:

if (!/^\d{2}\/\d{2}\/\d{4}$/.test(valor)) {
  return false
}

Se a data passou nas duas verificações anteriores, ela é dividida em três partes (dia, mês e ano) e armazenada em um objeto chamado data:

const partesData = valor.split('/')
const data = { 
  dia: partesData[0], 
  mes: partesData[1], 
  ano: partesData[2] 
}

As partes da data (dia, mês e ano) são convertidas de strings para números inteiros usando a função parseInt(). Isso é necessário porque as comparações seguintes serão feitas com números, não com strings:

const dia = parseInt(data.dia)
const mes = parseInt(data.mes)
const ano = parseInt(data.ano)

Então, é criado um array chamado diasNoMes que contém o número de dias de cada mês:

const diasNoMes = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]

Logo em seguida, se o ano fornecido for bissexto então o número de dias de fevereiro (índice 2 no array) deve atualizado para 29, já que fevereiro tem 29 dias em um ano bissexto. Para verificar se é um ano bisexto ele deve ser divisível por 4 e não por 100, exceto quando é divisível por 400:

if (ano % 400 === 0 || ano % 4 === 0 && ano % 100 !== 0) {
  diasNoMes[2] = 29
}

Agora, ocorrem as validações específicas da data:

  • Primeiro, verifica-se se o mês está entre 1 e 12 (valores válidos para os meses).
  • Também é verificado se o dia é maior que zero, já que não existe o dia 0.
  • Se alguma das duas condições acima for falsa, a função retorna false, indicando que a validação falhou.
  • Caso contrário, é realizada outra verificação para garantir que o dia não ultrapasse o número máximo de dias para o mês em questão consultando o array diasNoMes.
  • Se essa verificação também falhar, a função retorna false, indicando que a validação falhou.
if (mes < 1 || mes > 12 || dia < 1) {
  return false
}
else if (dia > diasNoMes[mes]) {
  return false
}

Se a data passar por todas as validações anteriores, isso significa que ela é válida e a função retorna true:

return true

Conclusão

Em suma, a função JavaScript validaData() é uma eficaz para verificar a validade de datas fornecidas em formato "dd/mm/aaaa". Com etapas bem definidas, ela realiza verificações quanto ao tipo da entrada, formato correto, dias em cada mês e a ocorrência de anos bissextos. Ao seguir essas etapas, a função garante que apenas datas válidas sejam aceitas.


Tags:

  • Datas
  • Validação
  • JavaScript

Compartilhar:

    O que achou do artigo?

    Escreva um comentário, deixe-me saber o que achou do artigo. Se tens uma dúvida basta perguntar:

    Resposta ao comentário:
    Loading...