Quero retornar uma idade em anos como int em um método Java. O que tenho agora é o seguinte, em que getBirthDate () retorna um objeto Date (com a data de nascimento ;-)):
public int getAge() {
long ageInMillis = new Date().getTime() - getBirthDate().getTime();
Date age = new Date(ageInMillis);
return age.getYear();
}
Mas desde que getYear () está obsoleto, estou me perguntando se existe uma maneira melhor de fazer isso? Não tenho certeza se isso funciona corretamente, pois ainda não tenho testes de unidade.
Respostas:
O JDK 8 torna isso fácil e elegante:
Um teste JUnit para demonstrar seu uso:
Todos devem estar usando o JDK 8 agora. Todas as versões anteriores passaram o fim de suas vidas de suporte.
fonte
null
s, mas usarObjects.requireNonNull
.Confira o Joda , que simplifica os cálculos de data / hora (o Joda também é a base das novas APIs de data / hora Java padrão, para que você aprenda uma API em breve).
Edição: Java 8 tem algo muito semelhante e vale a pena conferir.
por exemplo
que é tão simples quanto você poderia querer. O material pré-Java 8 é (como você identificou) um tanto pouco intuitivo.
fonte
fonte
Resposta moderna e visão geral
a) Java-8 (java.time-package)
Observe que a expressão
LocalDate.now()
está implicitamente relacionada ao fuso horário do sistema (que geralmente é ignorado pelos usuários). Para maior clareza, geralmente é melhor usar o método sobrecarregado,now(ZoneId.of("Europe/Paris"))
especificando um fuso horário explícito (aqui "Europa / Paris", por exemplo). Se o fuso horário do sistema for solicitado, minha preferência pessoal é escreverLocalDate.now(ZoneId.systemDefault())
para tornar a relação com o fuso horário do sistema mais clara. Isso é mais trabalhoso, mas facilita a leitura.b) Tempo de Joda
Observe que a solução Joda-Time proposta e aceita produz um resultado computacional diferente para as datas mostradas acima (um caso raro), a saber:
Considero isso um bug pequeno, mas a equipe da Joda tem uma visão diferente desse comportamento estranho e não deseja corrigi-lo (estranho porque o dia do mês da data de término é menor que o da data de início, portanto o ano deve ser um a menos). Veja também esta edição encerrada .
c) java.util.Calendar etc.
Para comparação, veja as várias outras respostas. Eu não recomendaria o uso dessas classes desatualizadas, porque o código resultante ainda é suscetível a erros em alguns casos exóticos e / ou muito complexo, considerando o fato de que a pergunta original parece tão simples. No ano de 2015, temos bibliotecas realmente melhores.
d) Sobre o Date4J:
A solução proposta é simples, mas às vezes falha em caso de anos bissextos. Apenas avaliar o dia do ano não é confiável.
e) Minha própria biblioteca Time4J :
Isso funciona de maneira semelhante à solução Java-8. Basta substituir
LocalDate
porPlainDate
eChronoUnit.YEARS
porCalendarUnit.YEARS
. No entanto, obter "hoje" requer uma referência explícita ao fuso horário.fonte
LocalDate.now
. Se omitido, o fuso horário padrão atual da JVM é aplicado implicitamente. Esse padrão pode mudar entre máquinas / sistemas operacionais / configurações e também pode a qualquer momento durante o tempo de execução por qualquer chamada de códigosetDefault
. Eu recomendo ser específico, comoLocalDate.now( ZoneId.for( "America/Montreal" ) )
fonte
(birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3)
? Parece inútil com a existência das comparações mês e dia / mês.Simplesmente uso os milissegundos em um valor constante de um ano para minha vantagem:
fonte
Se você estiver usando o GWT, ficará limitado ao uso do java.util.Date, eis um método que leva a data como números inteiros, mas ainda usa o java.util.Date:
fonte
A resposta correta usando o JodaTime é:
Você pode até encurtá-lo em uma linha, se quiser. Copiei a ideia da resposta de BrianAgnew , mas acredito que isso é mais correto, como você vê nos comentários (e responde exatamente à pergunta).
fonte
Com a biblioteca date4j :
fonte
Esta é uma versão melhorada da versão acima ... considerando que você deseja que a idade seja um 'int'. porque às vezes você não deseja preencher seu programa com várias bibliotecas.
fonte
Talvez seja surpreendente notar que você não precisa saber quantos dias ou meses existem em um ano ou quantos dias existem nesses meses. Da mesma forma, você não precisa saber sobre anos bissextos, segundos bissextos ou qualquer outro desse material usando este método simples e 100% exato:
fonte
Tente copiar este no seu código e use o método para obter a idade.
fonte
Eu uso este pedaço de código para cálculo de idade, espero que isso ajude ..sem bibliotecas usadas
fonte
Os campos nascimento e efeito são ambos campos de data:
Isso basicamente é uma modificação da solução de John O sem usar métodos depreciados. Passei bastante tempo tentando fazer com que o código dele funcionasse no meu código. Talvez isso salve os outros nesse momento.
fonte
Que tal este?
fonte
String
dateofbirth
tem a data de nascimento. e formato é o que for (definido na seguinte linha):Aqui está como formatar:
Variável
ageStr
terá os anos.fonte
Variante elegante, aparentemente correta , com registro de data e hora da solução Yaron Ronen.
Estou incluindo um teste de unidade para provar quando e por que não está correto . É impossível devido (possivelmente) a um número diferente de dias bissextos (e segundos) em qualquer diferença de carimbo de data / hora. A discrepância deve ser no máximo + -1 dia (e um segundo) para esse algoritmo, consulte test2 (), enquanto a solução de Yaron Ronen se baseia na suposição completamente constante de
timeDiff / MILLI_SECONDS_YEAR
pode diferir 10 dias para os 40 anos, mas essa variante também está incorreta.É complicado, porque essa variante aprimorada, usando a fórmula
diffAsCalendar.get(Calendar.YEAR) - 1970
, retorna resultados corretos na maioria das vezes, como o número de anos bissextos em média o mesmo entre duas datas.fonte
fonte
fonte
Aqui está o código java para calcular a idade no ano, mês e dias.
fonte
Maneira mais fácil sem bibliotecas:
fonte
ChronoUnit.YEARS.between( LocalDate.of( 1968 , Month.MARCH , 23 ) , LocalDate.now() )
. Veja a resposta corretaDateUtils
é uma bibliotecaCom o Java 8, podemos calcular a idade de uma pessoa com uma linha de código:
fonte
fonte
fonte
fonte
fonte
fonte
Agradeço todas as respostas corretas, mas esta é a resposta kotlin para a mesma pergunta
Espero que seja útil para desenvolvedores kotlin
fonte