Skip to content

fagnersales/extractTimeFromString

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 

Repository files navigation

extractTimeFromString

Busque uma data inserida dentro do texto com facilidade!

Packages necessários:

  • npmjs/ms - Para transformar a string em milisegundos.
npm install ms
npm install moment

extracTimeFromString() source:

const moment = require("moment");
moment.locale("pt-br");
const ms = require("ms");

async function extractTimeFromString(string) {
  if (!string) throw new Error("Você precisa especificar a string!");
  // Regex para buscar pelo tempo.
  const timePattern = /\d+\s?(days?|hours?|minutes?|dias?|horas?|minutos?|d|h|m)/gi;
  
  // criar um novo RegExp
  const timeRegex = new RegExp(timePattern);
  
  // O método `exec();` procura por um equivalente na string baseado no regex. 
  const result = timeRegex.exec(string);
  
  /* 
  * você também pode definir como:
  * if (!result) return false;
  * sendo assim, ele irá retornar uma boolean com valor false caso não encontre um tempo no texto.
  * mas como eu uso para uma função que necessita TER um texto, eu retorno um erro.
  */
  if (!result) throw new Error("Não há um tempo no texto.");
  
  // regex para buscar por todos os números
  const number = /\d+/g.exec(result[0])[0];
  // regex para buscar por todas as letras
  let type = /[A-Z]+/gi.exec(result[0])[0];
  
  // com essa separação (number e type) teremos um resultado de por exemplo:
  // {number: 14, type: "days" } 
  // 14 dias
  
  const firstIndexPosition = result.index;  
  const lastIndexPosition = (result.index + (number.length + type.length + 1)) 
  
  // Caso seja inserido um "type" em português, transformar em ingês.
  type = type.replace(/dia(s)?/gi, "days");
  type = type.replace(/hora(s)?/gi, "hours");
  type = type.replace(/minuto(s)?/gi, "minutes");

  const miliseconds = new Date().getTime() + ms(number + type);

  return {
    between: [firstIndexPosition, lastIndexPosition],
    ms: miliseconds,
    formated: moment(miliseconds).format("lll")
  }; 
}

Utilizando a função extractTimeFromString

extractTimeFromString("!kick <@474407357649256448> dois dias").then(console.log).catch(err => console.log(err.message))
// ∟ console: Não há tempo no texto.

extractTimeFromString("!kick <@474407357649256448> 2dias").then(console.log).catch(err => console.log(err.message))
// ∟ console: {
//  between: [ 28, 34 ],
//  ms: 1582273777448,
//  formated: '21 de Fev de 2020 às 05:29'
// }

extractTimeFromString("!kick <@474407357649256448>     25minutos").then(console.log).catch(err => console.log(err.message))
// ∟ console: {
//  between: [ 32, 42 ],
//  ms: 1582102508349,
//  formated: '19 de Fev de 2020 às 05:55'
// }

extractTimeFromString().then(console.log).catch(console.error);
// ∟ console: Você precisa especificar a string!

extractTimeFromString("!kick <@474407357649256448> 2 horas SPAM").then(console.log).catch(err => console.log(err.message));
// ∟ console: {
//  between: [ 28, 35 ],
//  ms: 1582108275039,
//  formated: '19 de Fev de 2020 às 07:31'
// }

Tempos considerados válidos:

12day
12 dias
12d
12h
12 hOrAS
12 MINuTEs

Links para auxiliar na compreensão do código:

Ordenados com base na aparição dentro da função extractTimeFromString

  1. Moment Docs - const moment = require("moment");
  2. ms Docs - const ms = require("ms");
  3. Async Function - async function extractTimeFromString(string) {
  4. RegExp Reference - const timeRegex = new ReExp(timePattern);
  5. exec(); Method - const result = timeRegex.exec(string);
  6. replace(); Method - type = type.replace(/dia(s)?/gi, "days");
  7. Date Object - const miliseconds = new Date().getTime() + ms(number + type);
  8. Array - between: [firstIndexPosition, lastIndexPosition],

Obrigado e espero ter ajudado! Para dúvidas você pode me chamar no discord! Eleven_#8917

(Deixe uma estrelinha caso tenha sido útil!!)

About

Busque uma data inserida dentro do texto com facilidade!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published