Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

klonder

Idade em JAVAFX, em anos, meses e dias.

Recommended Posts

Olá a todos!

Todos sabemos o quanto é difícil para o Java retornar, de modo fácil, a idade no formato: anos, meses e dias. Não estou me referindo a retornar o tempo entre duas datas em anos, o mesmo tempo em meses ou o mesmo em dias. Refiro-me a retornar quanto tempo uma determinada pessoa tem de vida, exemplo: 30 anos, 12 meses e 4 dias de vida.

Sabemos ainda que existem os anos bissextos, o que complica o cálculo em algumas situações. O JAVA não nos ajuda de modo automático, como em alguma outra linguagem.

Pensando nisso, desenvolvi um método que analisa as diversas situações e resolvi compartilhar, para outros colegas e para minhas consultas futuras. O método recebe como parâmetro uma data no formato yyyy-MM-dd (escolhi esse formato pois já vem do banco de dados) e retorna a idade no formato: 30a 4m 2d.

JAVAFX: Retornar idade em anos, meses e dias:

public String Idade(String dt_nasc) {//yyyy-MM-dd
        Calendar calHoje = GregorianCalendar.getInstance();
        int diah = calHoje.get(Calendar.DAY_OF_MONTH);
        int mesh = calHoje.get(Calendar.MONTH) + 1;
        int anoh = calHoje.get(Calendar.YEAR);
        
        // Data do nascimento.
        String[] quebraDN = dt_nasc.split("-");
        int dian = Integer.valueOf(quebraDN[2]);
        int mesn = Integer.valueOf(quebraDN[1]);
        int anon = Integer.valueOf(quebraDN[0]);
        
        String strNiver = anoh+"-"+mesn+"-"+dian;        
        Calendar calNiver = Calendar.getInstance();
        try {
            calNiver.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(strNiver));
        } catch (ParseException ex) {
            Logger.getLogger(FormataData.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        int anos = (calHoje.getTimeInMillis() < calNiver.getTimeInMillis())? (anoh-anon-1):anoh-anon ;
        int meses;
        int dias;
        
        meses = mesh - mesn;
        if (meses > 0) {//Verificando se já fez aniversário ou não
            if (diah < dian) {
                meses--;
            }
        } else if (meses < 0) {//Se o mês atual for menor que o mês do aniversário
            meses = 12 + meses;//Lembrar que meses está negativo, por isso a soma;
            //Da mesma forma, vamos comparar o dia atual com o dia do aniversário, para sabermos se o mês está completo ou não:
            if (diah < dian) {
                meses--;
            }
        } else {//Se o mês atual for o mês do aniversário:
            if (diah<dian) {
                meses = 11;
            } 
        }
        
        dias = diah - dian;
        if (dias < 0) {//Se dia hoje menor que dia do niver, somar os dias desde o mês anterior:
            if (mesh==5||mesh==7||mesh==8||mesh==10||mesh==12) {
                dias = 30-dian+diah;
            } else if (mesh==1||mesh==2||mesh==4||mesh==6||mesh==9||mesh==11) {
                dias = 31-dian+diah;
            } else {//Verificando se o ano é bissexto ou não: Esse else é para o mês 3, cujo anterior é fevereiro:
                if (anoh%4 == 0) {
                    dias = 29-dian+diah;
                } else {
                    dias = 28-dian+diah;
                }
            }
        }
        
        System.out.println(anos+"a "+meses+"m "+dias+"d");
        return anos+"a "+meses+"m "+dias+"d";
    }

Basta invocar o método através do evento de algum outro objeto, ou mesmo durante execução.

Divirtam-se!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Kefatif
      Prezados, boa tarde.
       
      Preciso criar um select que me traga do banco os registros que se repetem vazios nos últimos 3 meses nos campos:
      campo_a
      campo_b
       
      vazios (null).
       
      Podem me ajudar?
    • Por lucasseribeiro
      Bons dias, fórum!
       
      Procurei uma área específica para o JavaFX e não encontrei... Estou aprendendo a usar essa biblioteca, está ficando interessante, se assemelha às tecnologias web com as quais tenho muita familiaridade pois uso há anos. Mas o CSS do JavaFX é diferente daquele do consórcio W3, e não estou encontrando material para entender esse -fx-CSS... A referência CSS da Oracle (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html) é obscura e não contém as infos que preciso, apesar de esclarecer muitas coisas... Passa uma impressão de que eles não querem que todos saibam!
      Por exemplo: ao estilizar uma menu-bar, mudei seu background, alterei a cor da fonte dos menus, mas eles ficaram colados uns nos outros, e eu não entendi como escolher a propriedade CSS adequada do FX para controlar a distância dos menus. Pude usar um padding, mas ao executar, quando abrimos um menu, os outros ainda são empurrados pois ainda que suas inscrições estejam separadas, os botões do menu ainda estão colados. O tutoriais não abordam o CSS do FX em profundidade, focam-se nos objetivos dos projetos e suas abordagens...
      Rsrs, podia ter no W3Schools... Alguém pode me ajudar com isso???
       
      Grato desde já!
       
      Lucas Ribeiro
    • Por binds
      Olá Caríssimos,
       
      Não tenho muito conhecimento de javascript, desde já agradeço se alguém puder me ajudar.
      Preciso criar uma página simples de validação por idade para acessar uma página, a ideia é simples:
      se a pessoa nasceu antes de 2002 redireciona a página meusite_com_br/maior 
      mas se ela nasceu depois de 2002 redireciona a página meusite_com_br/menor
      Garimpando achei o código abaixo que fiz alguns ajustes, porém não sei como abrir as respectivas paginas meusite_com_br/menor ou meusite_com_br/maior como resultado, o resultado nesse caso são textos:  "MENOR 18" : "MAIOR DE 18"
       
      <!DOCTYPE html> <html> <body> <CENTER> <h2>Validador de Idade</h2> <p>Digite o ano que você nasceu para acessar o site:</p> <input id="age" value="Ex: 1990" /> <br> <button onclick="myFunction()">ACESSAR SITE</button> <p id="demo"></p> <script> function myFunction() {   var age, voteable;   age = Number(document.getElementById("age").value);   if (isNaN(age)) {     voteable = "Você não inseriu um ano válido. <BR> Exemplo: 2020";   } else {     voteable = (age > 2002) ? "MENOR 18" : "MAIOR DE 18";   }   document.getElementById("demo").innerHTML = voteable; } </script> </CENTER> </body> </html>  
      Novamente agradeço a ajuda!
      Luis
       
    • Por Pitag346
      Olá pessoal, tudo bem ?
       
      Estou com um probleminha bem chato que não faço ideia como resolver... Espero que me ajudem! Agradeço desde já.
       
      Vamos lá.
      Preciso fazer um calculo com a seguinte expressão:  (ValorAtual/100*10)+parseFloat(ValorAtual)-parseFloat(Saque)+parseFloat(Deposito);
      Até o momento estou obtendo sucesso com a expressão acima.  Agora vem o problema.
       
      Após eu obter o resultado da expressão acima, eu preciso substituir a variável ValorAtual com o  resultado do mesmo, isso 12 vezes. (12 meses).
      Não sei se ficou muito bem explicado, porem eu preciso fazer essa função com valores já definidos e as próximas 12 vezes com valores a definir ou 0.
      Vou fazer uma nova explicação com os códigos comentados:
       
      var ValorAtual = 1000;
      var Saque = 0;  // zero seria o padrão, eu poderia adicionar valores diferentes. (para cada mês, se possivel).
      var Deposito = 0; // zero seria o padrão, eu poderia adicionar valores diferentes. (para cada mês, se possivel)..
      var resultado = (ValorAtual/100*10)+parseFloat(ValorAtual)-parseFloat(Saque)+parseFloat(Deposito);
      Preciso recuperar o primeiro resultado, no exemplo acima seria: 1100
      Então após recuperar o valor acima, eu precisaria substituir o ValorAtual para 1100.
      Isso, 12 vezes... Recuperando o valor e substituindo como se fosse um calculo de juros mensais (12 meses).
       
       
      Tentei fazer com while mas não obtive exito. Estou parado com a função simples que detalhei acima. Obrigado.
       
      Espero tenham entendido e agradeço desde já!
       
       
       
       
    • Por lucasseribeiro
      Olá, fórum!!
       
      Ó... eu gostaria de criar uns applicativos em JavaFX e, um belo dia, comprei um livro e fui ao site baixar as versões atuais, bisoiar release notes (vai queu entendo alguma coisa)... E, de repente, me deparei com um detalhe: o JavaFX 12, que baixei em gluonhq.com/products/javafx/, não vinha com as classes principais, como Application, Scene, Stage & cia... Algo mudou? Estou baixando do lugar errado? Realidade alternativa? Ou não precisa mais dessas classes? É ilegal? O Toffoli proibiu?
       
      O livro não fala como obter o JavaFX, assume que a pessoa já tem!
       
      Grato
      Lucas Ribeiro
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.