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 CSTech
      Situação: Tenho um Scene principal(fxml), este por sua vez tem um button, ao clicar neste button abre um segundo Scene(detalhe - esse abre como filho).
      Minha dificuldade é, quero acessar qualquer componente do Scene principal através do Scene filho.
      É possível?
      Se sim me ajudem.
    • Por CSTech
      Situação: Tenho um Scene principal(fxml), este por sua vez tem um button, ao clicar neste button abre um segundo Scene(detalhe - esse abre como filho). Minha dificuldade é, quero acessar qualquer componente do Scene principal através do Scene filho. É possível? Se sim me ajudem.
    • 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
       
×

Informação importante

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