How do I search by date?

1

I want to create a "date" search system. It may not be the best question in the world. But I think it's valid and interesting, with the potential to generate good content for the site.

Example

var buscar = function() {
  if (data == "01 de Janeiro de 2017") {
    alert('Opa! Me lembro desta data.');
  } else {
    if (data == "01 de Fevereiro de 2017") {
      alert('Opa! Me lembro desta data.');
    } else {
      if (data == "01 de Março de 2017") {
        alert('Opa! Me lembro desta data.');
      } else {
        alert('Nada encontrado!')
      }
    }
  }
}
<input type="text" value="" id="campo" onChange="data = this.value" />
<input type="button" value="Buscar!" onClick="data = document.getElementById('campo').value; buscar();" />
<pre>Ex.: 01 de Janeiro de 2017<pre>

What I need is to develop a separate function, which will treat the search system by date, ignoring the month and the year is in full or just abbreviated ( acronym ). For example:

Jan 1, 17

Instead of typing in full:

January 1, 2017

However it should return the correct result .

Another detail is that if the user puts uppercase or lowercase , accents and cedilla letters. Still it should work fine.

    
asked by anonymous 02.03.2017 / 16:57

2 answers

2

I think working with timestamp in this case would be ideal, the problem here would be to convert a list of dates that can be in n formats from the database to timestamp, and then check if the date sent by the user, which can also being in n formats exists within this array.

function search() {
  try {
    // Recebe a data escrita no campo field
    dataSend = document.getElementById('field').value;
    // Se a data tiver menos que 8 caracteres, retorna erro
    if (dataSend.length < 7) {
      throw new Error('Entre com uma data');
    }
    // Chama a função que remove os caracteres nao necessarios e retorna o timestamp
    dataSend = returnTimestamp(dataSend);

    // Recebe datas que podem estar em qualquer um dos formatos especificados, pode vir do banco, de um webserver ou qualquer lugar
    datesInRange = ["01/01/2001", "8 de Março de 2008", "01 de Jan de 2017", "4/Agosto/1995", "12 Julho 1995","fev/2007","10/1998"];
    // Inicializo o array que vai receber os timestamps das datas
    timestampsInRange = [];
    // Para cada elemento dentro das datas recebidas....
    for (i = 0; i < datesInRange.length; i++) {
      // Chama a função que remove os caracteres nao necessarios e retorna o timestamp
      timestampConvert = returnTimestamp(datesInRange[i]);
      // Adiciono o timestamp no array
      timestampsInRange.push(timestampConvert);
    }
    // Verifico se o timestamp enviado existe no array de timestamps
    var exist = timestampsInRange.indexOf(dataSend);
    if (exist >= 0) {
      alert("valor encontrado");
    } else {
      alert("valor não encontrado");
    }
  }catch(err) {
    alert("Provavelmente a data que tentou pesquisar não é válida");
  }
}

// Função remove um elemento especificado
function removeValue(index, arr) {
  arr.splice(index, 1);
}
// Função que faz a conversão de date para timestamp, recebe um array por default
function convertDateToTimestamp(dateToConvert) {
  // Assume que esta no formato mes/ano
  if (dateToConvert.length == 2) {
    dateToConvert.unshift("01");
  }
  // Se a data foi enviada por extenso....
  if (dateToConvert[1].length > 3) {
    // Pego somente o inicio dela
    dateToConvert[1] = dateToConvert[1].substring(0, 3);
  }
  // Envio a variavel para a função que vai me retornar a string correta para converter em timestamp, ja convertida para lowerCase
  dateToConvert[1] = convertMonth(dateToConvert[1].toLowerCase());
  // Junto o array e retorno o timestamp convertido
  return (new Date(dateToConvert.join(" ")).getTime() / 1000);
}

// Função remove o que não é necessário e retorna o timestamp
function returnTimestamp(dataToVerify) {
  // Separa a string da data
  dataToVerify = dataToVerify.split(/[/ ]/);
  // Para cada delimitador da data....
  for (y = 0; y < dataToVerify.length; y++) {
    // Se o delimitador for um "de"....
    if (dataToVerify[y] == "de") {
      // Remove o elemento do array
      removeValue(y, dataToVerify);
    }
  }
  // Retorno chamando a função que converte o valor de date para timestamp
  return convertDateToTimestamp(dataToVerify);
}

// Função converte a string do mes para o padrão em inglês
function convertMonth(month) {
  switch (month) {
    case "1": case "01": case "jan": return "jan";
    case "2": case "02": case "fev": case "feb": return "feb";
    case "3": case "03": case "mar": return "mar";
    case "4": case "04": case "abr": case "apr": return "apr";
    case "5": case "05": case "mai": case "may": return "may";
    case "6": case "06": case "jun": return "jun";
    case "7": case "07": case "jul": return "jul";
    case "8": case "08": case "ago": case "aug": return "aug";
    case "9": case "09": case "set": case "sep": return "sep";
    case "10": case "out": case "oct": return "oct";
    case "11": case "nov": return "nov";
    case "12": case "dez": case "dec": return "dec";
  }
}
<input type="text" value="" id="field" />
<input type="button" value="Buscar!" onclick="search()" />
<pre>Exs.:</pre>
<pre>01/01/2001<pre>
<pre>8 de Março de 2008<pre>
<pre>01 de Jan de 2017<pre>
<pre>4/Agosto/1995<pre>
<pre>12 Julho 1995<pre>
<pre>fev/2007 que seria o equivalente a 1/2/2007<pre>
<pre>10/1998 que seria o equivalente a 1/10/1998<pre>
/\ Tente em qualquer um desses formatos :).
Não funciona no padrão Americano: 25/02/2001, 10/10/2015

The function is not case-sensitive, that is, it either types the month name, for example: JaNeIro, January, janEIRO, or in English, February, feBruAry, etc.

I also leave the jsfiddle

    
03.03.2017 / 21:43
0

From what I understand, you want to validate the date to see if it is correct, so use this function:

var buscar = function(date) {
  var validation = new Date(date)  
  if(validation !== 'Invalid Date'){
     alert('date correta')
  } else {
     alert('data incorreta')
   }
}

If you want to format the date for a specific locale (I recommend saving in the bank), use moment.js

link

    
03.03.2017 / 18:49