Converter data de nascimento para idade no JSF

Java

JAVA EE

XHTML

12/03/2019

Olá pessoal, eu estou começando a aprender JSF e tenho um projeto para medir o IMC (Indice de Massa Corporal) da pessoa. O problema de verdade é que, no código, eu peço para o usuário colocar a data de nascimento como um input e, depois de calcular o IMC, na página seguinte eu mostro a idade e eu não estou conseguindo fazer isso. Já procurei no google e achei várias funções em Java, mas com variáveis definidas, no meu caso o programa teria que pegar do banco o input e converter para idade, certo ?
Ex: Na página index eu coloco no campo "Data de Nascimento" 12/03/2000 e, depois de calcular o IMC, na página seguinte, precisa aparecer 19

Página index.xhtml

<h:body>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel value="Nome:" for="nome"/>
<h:inputText value="#{dadosIMC.dados.nome}" id="nome"
label="nome"/>
<h:outputLabel value="CPF:" for="cpf"/>
<h:inputText value="#{dadosIMC.dados.cpf}" id="cpf"
label="cpf"
validatorMessage="#{msgs.erroCPF}"/>
<h:outputLabel value="E-mail:" for="email"/>
<h:inputText value="#{dadosIMC.dados.email}" id="email"
label="email"
validatorMessage="#{msgs.erroEmail}"/>
<h:outputLabel value="Data de Nascimento:" for="nascimento"/>
<h:inputText value="#{dadosIMC.dados.nascimento}" id="nascimento"
label="data de nascimento"
validatorMessage="#{msgs.erroNascimento}"> /*Aqui onde coloca a data de nascimento*/
<f:convertDateTime type="date" pattern="dd/MM/yyyy" />
</h:inputText>
<h:outputLabel value="Peso (KG):" for="peso"/>
<h:inputText value="#{dadosIMC.dados.peso}" id="peso"
label="peso"/>
<h:outputLabel value="Altura (CM):" for="altura"/>
<h:inputText value="#{dadosIMC.dados.altura}" id="altura"
label="altura"/>
</h:panelGrid>
<h:commandButton value="Calcular" action="#{dadosIMC.dados.calculaIMC()}"/>
</h:form>
</h:body>

Página calculo.xhtml

<h:body>
<h:panelGrid columns="2">
Nome:
<h:outputText value="#{dadosIMC.dados.nome}"/>
CPF:
<h:outputText value="#{dadosIMC.dados.cpf}">
<f:converter converterId="converter.ConversorCPF"/>
</h:outputText>
E-mail:
<h:outputText value="#{dadosIMC.dados.email}"/>
Idade:
<h:outputText value="#{dadosIMC.dados.nascimento}"/> /*Aqui deveria aparecer a idade do usuário: data atual - data de nascimento*/
IMC:
<h:outputText value="#{dadosIMC.dados.imc}">
<f:convertNumber pattern = "#00.00" />
</h:outputText>
Resultado:
<h:outputText value="#{dadosIMC.dados.resultado}"/>
</h:panelGrid>
<h:button value="Voltar" outcome="/index"/>
</h:body>
Marcus Vinícius

Marcus Vinícius

Curtidas 0

Melhor post

Ana Lichirgu

Ana Lichirgu

13/03/2019

Tente usar Joda-Time.

Seria mais ou menos isso...
import org.joda.time.*;
import org.joda.time.format.*;
class TesteIdade {
public static void main(String[] args) {
DateTime start = new DateTime(1980, 7, 20, 0, 0, 0, 0);
DateTime end = new DateTime(2008, 2, 13, 0, 0, 0, 0);
Period per = new Period (start, end);
// Isto imprime "27 years, 6 months, 3 weeks and 3 days"
System.out.println (PeriodFormat.getDefault().print (per));
// Isto imprime "27 anos, 6 meses, 3 semanas e 3 dias"
PeriodFormatter pf = new PeriodFormatterBuilder()
.appendYears()
.appendSuffix (" ano, ", " anos, ")
.appendMonths()
.appendSuffix (" mês, ", " meses, ")
.appendWeeks()
.appendSuffix (" semana e ", " semanas e ")
.appendDays()
.appendSuffix (" dia ", " dias ")
.toFormatter();
System.out.println (pf.print (per));
}
}

Dá uma adaptada em como você precisa que seja exibido...

PS: Pode colocar esse método no main.

Espero ter ajudado.
GOSTEI 1

Mais Respostas

Marcus Vinícius

Marcus Vinícius

12/03/2019

Tente usar Joda-Time.

Seria mais ou menos isso...
import org.joda.time.*;
import org.joda.time.format.*;
class TesteIdade {
public static void main(String[] args) {
DateTime start = new DateTime(1980, 7, 20, 0, 0, 0, 0);
DateTime end = new DateTime(2008, 2, 13, 0, 0, 0, 0);
Period per = new Period (start, end);
// Isto imprime "27 years, 6 months, 3 weeks and 3 days"
System.out.println (PeriodFormat.getDefault().print (per));
// Isto imprime "27 anos, 6 meses, 3 semanas e 3 dias"
PeriodFormatter pf = new PeriodFormatterBuilder()
.appendYears()
.appendSuffix (" ano, ", " anos, ")
.appendMonths()
.appendSuffix (" mês, ", " meses, ")
.appendWeeks()
.appendSuffix (" semana e ", " semanas e ")
.appendDays()
.appendSuffix (" dia ", " dias ")
.toFormatter();
System.out.println (pf.print (per));
}
}

Dá uma adaptada em como você precisa que seja exibido...

PS: Pode colocar esse método no main.

Espero ter ajudado.


Obrigado pela ajuda ! Mas é exatamente isso que eu estou evitando, números estáticos. Eu não sei que ano o usuário nasceu, só o ano atual.
GOSTEI 0
POSTAR