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
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– andrepaulo
What you want to do is just what Moment.js does, and the framework is not small, take a look at http://momentjs.com/
– andrepaulo
why don’t you put datetime plugins instead create this complication?
– Ricardo Costa
@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
– Diego Henrique