How do I search by date?

Asked

Viewed 373 times

1

I intend to create a "date" search system. It may not be the best question in the world. But I find 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 deal with the search system by date, ignoring if .. o month and the year in full or only abbreviated(acronym). For example:

01 of Jan of 17

Instead of typing in full:

01 of January of 2017

However it must returns the correct result.

Another detail is that if the user puts letters capital letters or lowercase, accents and cedilla. Still should work out nicely.

  • I don’t know if I got it right, but what I would do is, I would use the js library moment.js by the ease of working with conversions and etc., would make the conversation of what was typed to a Date object and then would make the comparison, returning only the results that give the match

  • What you want to do is just what Moment.js does, and the framework is not small, take a look at http://momentjs.com/

  • why don’t you put datetime plugins instead create this complication?

  • @Ricardocosta I understand what you tell me, it would be taking a shorter shortcut. But I need to use my free time in a profitable way, ie, learn to program (create). Instead of depending soon on the face of Biblotecas and the like. Because knowing the connection is one thing, programming is totally another, is imagining and creating from scratch. If you know the language itself, you can only change one thing there or here, but not actually program. Only builds and modifies a ready source code that is already from another author. Libraries came to help, but I prefer to deepen the language

2 answers

2


I believe that working with timestamp in this case would be ideal, the problem here would be to convert a list of dates that may be in n formats coming from the database to timestamp, and then check if the date sent by the user, which can also be in n formats exists within that 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, IE, whatever makes type the name of the month so for example: January, January, Juniper, or in English, February, February, etc.

I also leave the jsfiddle

0

From what I understand you’re trying to validate the date to see if it’s 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 database), use Moment.js

https://momentjs.com/

Browser other questions tagged

You are not signed in. Login or sign up in order to post.