Converter fator de vencimento de boleto em data (número de dias)

Neste artigo você vai aprender a converter fator de vencimento de boleto em data, utilizando JavaScript para exibir no formato dd/mm/aaaa

Converter fator de vencimento de boleto em data capa

Fala programador(a), beleza? Bora aprender mais sobre conversão de datas e também boletos em JavaScript!

Para realizar esta funcionalidade vamos precisar pegar o começo da última parte do código do boleto, os quatro primeiros dígitos contém a data

Vamos utilizar manipulação de string para resgatar estes dígitos e depois criar uma data baseada em uma fórmula que dá a data

Veja um exemplo prático:

var codigoDeBarras = "52459.12136 21627.007186 37931.981056 7 80260000001400";

var vencimento = codigoDeBarras.slice(40, 44); //7026 é o que precisamos

var date = new Date('10/07/1997');

date.setTime(date.getTime() + (vencimento * 24 * 60 * 60 * 1000)); // criando a data de vencimento

console.log(("0" + (date.getDate())).slice(-2) + '/' + ("0" + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear()); // exibição da data

Veja que em vencimento resgatamos os dígitos que representam a data de vencimento “codificada”

Formação Claude Code
Formação Recomendada

Formação Claude Code

Domine Claude Code do absoluto zero até o avançado

  • 120 aulas
  • 4 projetos
  • 9h 45min

E transformamos ela para data legível em date.seTime, que é onde manipulamos nosso objeto Date para a data de vencimento do boleto

Por fim exibimos a data completa por meio dos getters de Date, caso o dia de vencimento seja até 9, adicionamos um 0 a esquerda, que é o padrão convencional

E desta forma conseguimos obter a data de vencimento através do código de barras de um boleto com JavaScript, para apresentar ao usuário no site/sistema

Obs: o horário de verão não está mais em vigor no país, porém caso um dia voltar a existir o código acima pode retornar o dia errado

Então você deve incluir nos seus testes um checagem para esta variável, assim se prevenindo de um eventual erro por causa do mesmo

Conclusão

Neste artigo aprendemos a como converter fator de vencimento de boleto em data

Transformando o número recebido do código de barras para o padrão de data dd/mm/aaaa, que é o utilizado no Brasil

Note que utilizamos manipulação de string para isso, resgatando exatamente os números que são necessários do boleto

E além disso o apoio do objeto Date de JavaScript foi fundamental para trabalhar com datas de forma simples

Confira também nosso catálogo de cursos gratuitos, com aulas semanais no YouTube

O que é o fator de vencimento?

Antes de sair fatiando string, vale entender o porquê da conta funcionar

O fator de vencimento não é uma data, é um CONTADOR de dias

Ele guarda quantos dias se passaram desde uma data base fixa do padrão dos boletos brasileiros, e é por isso que a conversão é sempre a mesma receita: pega a data base, soma os dias do fator e pronto, tu tem o vencimento

Se você já mexeu com timestamp (aquele monte de número que representa um instante), a ideia é a mesma, só que a unidade aqui é dia em vez de milissegundo 🙂

Entendendo isso, o código lá de cima deixa de ser mágica: setTime só está somando os dias do fator na data base

Função pronta pra usar (com validação):

O exemplo acima é ótimo pra entender, mas em sistema de verdade tu não quer aquilo solto no meio do arquivo

Então bora isolar em duas funçõezinhas, uma que converte e outra que formata:

function fatorParaData(fator, dataBase) {
const dias = Number(fator)

if (!Number.isInteger(dias) || dias <= 0) return null

const data = new Date(dataBase.getTime())
data.setDate(data.getDate() + dias)

return data
}

function formatarData(data) {
return ("0" + data.getDate()).slice(-2) + '/' +
("0" + (data.getMonth() + 1)).slice(-2) + '/' +
data.getFullYear()
}

E o uso, com a mesma data base do exemplo lá de cima:

const dataBase = new Date('10/07/1997')
const vencimento = fatorParaData(codigoDeBarras.slice(40, 44), dataBase)

console.log(vencimento ? formatarData(vencimento) : 'fator inválido')

Repara no return null: se vier string vazia, letra ou zero (acontece bastante quando o campo do formulário está incompleto), a função avisa em vez de devolver uma data doida pro usuário

Já me ferrei com isso uma vez, o sistema mostrava um vencimento inventado e ninguém desconfiava

E o caminho contrário, de data para fator de vencimento?

Essa é a dúvida que sempre aparece depois: e se eu já tenho a data e preciso do fator?

É a mesma conta invertida, tu pega a diferença entre as duas datas e divide pelo tamanho de um dia:

function dataParaFator(data, dataBase) {
const umDia = 24 * 60 * 60 * 1000

return Math.round((data.getTime() - dataBase.getTime()) / umDia)
}

O Math.round está ali de propósito, não é frescura: qualquer diferença de horário entre as duas datas gera número quebrado, e arredondar mata esse ruído

Faça o teste, converta um fator pra data com a função anterior e devolva ela pra essa aqui, o número tem que voltar igualzinho

Por que o dia às vezes sai um a mais (ou um a menos)?

Tome cuidado com esse aqui, porque é o bug clássico e ele passa despercebido em teste rápido

O objeto Date carrega HORA junto, não só o dia

Então se a data base nasce grudada na virada do dia, qualquer deslocamento de fuso empurra o resultado pro dia anterior ou pro seguinte, e tu só descobre quando um cliente reclama

O jeito mais simples de blindar é travar o horário da data base longe da virada:

const dataBase = new Date('10/07/1997')
dataBase.setHours(12, 0, 0, 0) // longe da meia noite, o fuso não vira o dia

Com isso a soma de dias pode escorregar algumas horas à vontade que o getDate() continua devolvendo o dia certo

E guarda essa: sempre valide o resultado contra um boleto de verdade que tu já sabe o vencimento, é o teste mais barato que existe

Antes de fatiar, se liga numa coisa: a posição dos dígitos depende do formato da string que tu recebeu

Código com pontos e espaços, código já limpo, código vindo do leitor óptico, cada um tem um tamanho diferente, e um slice fixo em cima do formato errado devolve os dígitos errados sem dar nenhum erro

Então padronize a entrada antes de qualquer coisa e confira o índice usando um código que tu JÁ sabe a data de vencimento, aí sim fixa o número no código

Perguntas frequentes:

O que é o fator de vencimento do boleto?

É um contador de dias, não uma data. Ele diz quantos dias se passaram desde uma data base fixa do padrão dos boletos, e a conversão é somar esses dias na data base

Por que a data que eu converti veio errada?

Quase sempre é um dos dois: tu pegou os dígitos na posição errada (o formato da string mudou) ou o horário da data base está encostado na virada do dia e o fuso empurrou o resultado

Dá pra fazer o contrário, gerar o fator a partir de uma data?

Dá sim, é a mesma conta invertida: diferença entre as duas datas dividida pelo tamanho de um dia, tem a função pronta ali em cima

Essa lógica só funciona em JavaScript?

Não, o conceito é o mesmo em qualquer linguagem, muda só a API de data. Somar dias numa data base é soma de dias em Python, PHP, Java, no que tu quiser 😀

Leia também

Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

1 Comentário
Oldest
Newest Most Voted
Luiz

Faltou tratar vencimentos superiores a 21/02/2025 quando o fator é maior que 9999.

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares