una - ¿Cómo puedo calcular la edad en Java con precisión? Fecha de nacimiento
edad a partir de fecha de nacimiento java (4)
A continuación se muestra un ejemplo de cómo calcular la edad de una persona, si hoy es su cumpleaños, y cuántos días quedan hasta su cumpleaños si hoy no es su cumpleaños utilizando las nuevas clases del paquete java.time que se incluyeron como parte de Java 8.
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1982, 9, 26);
LocalDate thisYearsBirthday = birthday.with(Year.now());
long age = ChronoUnit.YEARS.between(birthday, today);
if (thisYearsBirthday.equals(today))
{
System.out.println("It is your birthday, and your Age is " + age);
}
else
{
long daysUntilBirthday = ChronoUnit.DAYS.between(today, thisYearsBirthday);
System.out.println("Your age is " + age + ". " + daysUntilBirthday + " more days until your birthday!");
}
Estoy tratando de calcular la edad en Java que representa los meses, por lo que restar años no funcionará. También quiero decirle al usuario si hoy es su cumpleaños. Aquí está el código que tengo hasta ahora, pero me temo que está un poco apagado. Tampoco dirá si hoy es el cumpleaños aunque las dos fechas que está comparando son iguales. La forma en que traté de calcular originalmente estaba usando milisegundos. La razón por la que ve 2 formas de obtener la fecha actual es porque estaba intentando hacer algo para que funcione, pero quería mostrarle a todos mi trabajo para que pudieran orientarme en la dirección correcta.
EDITAR PARA CLARIFICAR lo que quiero decir es que 2015-1993 puede tener 22 años o 21 dependiendo de si su cumpleaños ya pasó este año. Quiero estar seguro de tener la edad correcta con esto en mente.
public class ShowAgeActivity extends AppCompatActivity {
private TextView usersAge;
private static long daysBetween(Date one, Date two)
{
long difference = (one.getTime()-two.getTime())/86400000; return Math.abs(difference);
}
private Date getCurrentForBirthday()
{
Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
int birthdayYear = birthday.getYear() + 1900;
Calendar cal = Calendar.getInstance();
cal.set(birthdayYear, Calendar.MONTH, Calendar.DAY_OF_MONTH);
Date current = cal.getTime();
return current;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_age);
Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
Date currentDay = Calendar.getInstance().getTime();
long age = daysBetween(birthday,currentDay)/365;
usersAge =(TextView)findViewById(R.id.ageTextView);
if (birthday.compareTo(getCurrentForBirthday()) == 0 )
{
usersAge.setText("It is your birthday, and your Age is " + String.valueOf(age));
}
usersAge.setText("Your Age is " + String.valueOf(age));
}
}
Este es un código que uso para descubrir qué tan viejo es algo.
Long time= currentDate.getTime / 1000 - birthdate.getTime / 1000
int years = Math.round(time) / 31536000;
int months = Math.round(time - years * 31536000) / 2628000;
Esto funciona para mí
Calendar currentDate = Calendar.getInstance();
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");
Date birthdate = null;
try {
birthdate = myFormat.parse(yourDate);
} catch (ParseException e) {
e.printStackTrace();
}
Long time= currentDate.getTime().getTime() / 1000 - birthdate.getTime() / 1000;
int years = Math.round(time) / 31536000;
int months = Math.round(time - years * 31536000) / 2628000;
La respuesta de Nate es buena. Pero ignora el problema de la zona horaria. Y hay un enfoque más explícito posible.
Zona horaria
La zona horaria es crucial para determinar la fecha. Por ejemplo, un nuevo día amanece antes en París que en Montreal.
Si se omite, la zona horaria predeterminada actual de la JVM se aplica implícitamente. Le sugiero que, en su lugar, haga explícita la zona horaria que espera / desea.
Use un nombre de zona horaria apropiado , estilo continente / ciudad. Nunca use los códigos de 3-4 letras como "EST" o "IST".
java.time
El marco java.time ( Tutorial ) integrado en Java 8 y posterior incluye la clase Period
para representar un lapso de tiempo como una cantidad combinada de años, cantidad de meses y cantidad de días.
Puede consultar un Period
para extraer cada uno de esos tres componentes.
El método toString
del período genera de forma predeterminada una cadena en el formato definido por ISO 8601 , donde una P
marca el comienzo seguido de un dígito y una letra tres veces. Por ejemplo, un año y medio: P1Y6M
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
LocalDate birthdate = LocalDate.of( 1960 , 2 , 17 );
Period p = Period.between( birthdate , today );
String output = p.toString();
Integer age = p.getYears();
Boolean isTodayBirthday = ( (p.getMonths() == 0 ) && ( p.getDays() == 0 ) );
Otro enfoque utiliza la clase MonthDay
para representar un mes-día sin un año.
Boolean isBirthdayToday =
MonthDay.from( birthdate )
.equals( MonthDay.from( today ) ) ;
Androide
Para Android, no tienes tecnología Java 8 como java.time.
Puede buscar algunos proyectos que respalden las clases de java.time. No sé qué tan exitosos son.
Además, puede usar Joda-Time, una biblioteca de terceros que inspiró el marco java.time (JSR 310). El código Joda-Time debería ser similar al anterior. Excepto que la clase Período tiene una resolución más fina, que va a horas, minutos y segundos. Para truncar esa información adicional, llame al método withTimeAtStartOfDay
.