Caixa de Ferramentas Úteis

Ferramentas online grátis: calcule diferença de datas, idade e próximo aniversário, descubra o dia da semana, verifique anos bissextos, faça contagem regressiva, valide CPF e CNPJ, calcule porcentagens e gere senhas seguras.

🧰 Caixa de Ferramentas Úteis

Calculadora de datas, idade, dia da semana, ano bissexto, contagem regressiva, validador CPF/CNPJ, porcentagens e gerador de senhas. Tudo offline.

1) Diferença de Datas

2) Idade & Próximo Aniversário

3) Dia da Semana

4) Ano Bissexto?

5) Contagem Regressiva

6) Validador CPF/CNPJ

7) Porcentagem & Regra de Três

Preencha 3 campos e deixe 1 em branco que eu calculo.


Porcentagem rápida

8) Gerador de Senhas

••••••••••••
Meses (aprox.): ${monthsAprox}
Anos (aprox.): ${yearsAprox}
`; }; /* 2) Idade & próximo aniversário */ $('btnAge').>Informe a data de nascimento.'; const today=new Date(); today.setHours(0,0,0,0); let age = today.getFullYear()-dob.getFullYear(); const hadBirthday = (today.getMonth()>dob.getMonth()) || (today.getMonth()==dob.getMonth() && today.getDate()>=dob.getDate()); if(!hadBirthday) age--; const nextYear = hadBirthday? today.getFullYear()+1 : today.getFullYear(); const nextBD = new Date(nextYear, dob.getMonth(), dob.getDate()); nextBD.setHours(0,0,0,0); const daysTo = diffDays(today, nextBD); $('outAge').innerHTML = `
Idade: ${age} anos
Próximo aniversário: ${fmtDate(nextBD)} (${daysTo} dia(s))
`; }; /* 3) Dia da semana */ $('btnWeekday').>Informe a data.'; const days=['domingo','segunda-feira','terça-feira','quarta-feira','quinta-feira','sexta-feira','sábado']; $('outWeekday').innerHTML = `
${fmtDate(d)} caiu em ${days[d.getDay()]}.
`; }; /* 4) Ano bissexto */ $('btnLeap').>Informe um ano válido.'; const leap = (y%400===0) || (y%4===0 && y%100!==0); $('outLeap').innerHTML = leap ? 'Sim, é bissexto (29 dias em fevereiro).' : 'Não é bissexto.'; }; /* 5) Contagem regressiva */ let timer=null; function fmt2(n){ return String(Math.floor(n)).padStart(2,'0'); } $('btnStartCountdown').>Informe a data e hora alvo.'; const target = new Date(val); if(timer) clearInterval(timer); timer = setInterval(()=>{ const now=new Date(); let diff = Math.max(0, (target - now)/1000); // s const d = Math.floor(diff/86400); diff-=d*86400; const h = Math.floor(diff/3600); diff-=h*3600; const m = Math.floor(diff/60); diff-=m*60; const s = Math.floor(diff); $('outCountdown').textContent = `${d}d ${fmt2(h)}h ${fmt2(m)}m ${fmt2(s)}s`; if(target<=now){ clearInterval(timer); $('outCountdown').textContent = '⏰ Chegou!'; } }, 250); }; $('btnStopCountdown').>Digite um CPF ou CNPJ.'; if(digits.length<=11){ const ok = validaCPF(digits); $('outDoc').innerHTML = ok ? `CPF válido — ${maskCPF(digits)}` : 'CPF inválido'; } else { const ok = validaCNPJ(digits); $('outDoc').innerHTML = ok ? `CNPJ válido — ${maskCNPJ(digits)}` : 'CNPJ inválido'; } }; /* 7) Regra de três */ function countFilled(ids){ return ids.filter(id=> $(''+id).value!=='' ).length; } $('btnRule').>Preencha exatamente 3 campos (deixe 1 em branco).'; let msg=''; if(isNaN(A)||isNaN(B)||isNaN(C)||isNaN(D)){ // calcula o vazio if($('rA').value===''){ $('rA').value = (B*C/D).toFixed(4); msg='A = (B×C)/D'; } else if($('rB').value===''){ $('rB').value = (A*D/C).toFixed(4); msg='B = (A×D)/C'; } else if($('rC').value===''){ $('rC').value = (A*D/B).toFixed(4); msg='C = (A×D)/B'; } else if($('rD').value===''){ $('rD').value = (B*C/A).toFixed(4); msg='D = (B×C)/A'; } } $('outRule').textContent = 'Fórmula usada: ' + msg; }; $('btnClearRule').>Informe valor e %.'; const inc = pct(base,p); $('outPct').innerHTML = `${p}% de ${base} = ${inc.toFixed(2)} → novo total: ${(base+inc).toFixed(2)}`; }; $('btnPctDown').>Informe valor e %.'; const dec = pct(base,p); $('outPct').innerHTML = `${p}% de ${base} = ${dec.toFixed(2)} → com desconto: ${(base-dec).toFixed(2)}`; }; /* 8) Gerador de senhas */ const sets = { upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', lower: 'abcdefghijklmnopqrstuvwxyz', nums: '0123456789', syms: '!@#$%^&*()-_=+[]{};:,.?/|~' }; $('btnGenPw').>Selecione ao menos um conjunto (A-Z, a-z, 0-9, símbolos).'; let out=''; const cryptoOK = window.crypto && crypto.getRandomValues; for(let i=0;i{ const s=$('outPw').textContent.trim(); if(!s || s.includes('•')) return; try{ await navigator.clipboard.writeText(s); $('btnCopyPw').textContent='Copiado!'; setTimeout(()=>$('btnCopyPw').textContent='Copiar',1200); }catch(e){} }; })();