Busque uma data inserida dentro do texto com facilidade!
- npmjs/ms - Para transformar a string em milisegundos.
npm install ms
- npmjs/moment - Para formatar os milisegundos em uma data.
npm install moment
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")
};
}
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'
// }
12day
12 dias
12d
12h
12 hOrAS
12 MINuTEs
Ordenados com base na aparição dentro da função extractTimeFromString
- Moment Docs -
const moment = require("moment");
- ms Docs -
const ms = require("ms");
- Async Function -
async function extractTimeFromString(string) {
- RegExp Reference -
const timeRegex = new ReExp(timePattern);
- exec(); Method -
const result = timeRegex.exec(string);
- replace(); Method -
type = type.replace(/dia(s)?/gi, "days");
- Date Object -
const miliseconds = new Date().getTime() + ms(number + type);
- 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!!)