¿Cómo puedo calcular la edad en Java con precisión? Fecha de nacimiento
Estoy tratando de calcular la edad en Java que las cuentas de meses, por lo que sólo restando 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 es un poco fuera. También no dirá si hoy es el cumpleaños, aunque las dos fechas que compara son iguales. La forma en que traté de calcular originalmente estaba usando milisegundos. La razón por la que ves 2 maneras de obtener la fecha actual es porque estaba intentando algo para conseguir que funcione, pero quería mostrar a todos mi trabajo para que pudieran señalarme en la dirección correcta.
EDITAR PARA CLARIFICACIÓN lo que quiero decir es 2015-1993 puede ser de 22 años o 21 dependiendo si su cumpleaños ya ha pasado este año. Quiero estar seguro de que tengo la edad correcta con esto en mente.
- RxJava / RxBinding: cómo manejar los errores en RxView
- Android - fuera de error de memoria -Modificador de cadena agrandar buffer
- Los valores de los hiladores no están ajustados correctamente
- Cambiar el color de Switch en Android
- Convertir cadena a JsonArray
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)); }
}
- Android: Constructor es ambiguo cuando paso Null, pero no cuando paso una variable asignada a Null
- No "Configuración del proyecto" en "Estructura del proyecto"
- Descarga de archivos PDF con BlockingQueue
- Generar Java desde WSDL para usarlo en Android con el cliente SOAP ksoap2-android?
- Cómo organizar mejor mi clase de base de datos SQLite en Android
- Android: "El servidor no pudo procesar tu apk. Intentar de nuevo .. "error al cargar en el mercado
- Cómo analizar 2013-03-13T20: 59: 31 + 0000 cadena de fecha hasta la fecha
- Cómo obtener el tamaño de un tamaño de aplicación + de datos de la aplicación
A continuación se muestra un ejemplo de cómo calcular la edad de una persona, si hoy es su cumpleaños, así como cuántos días quedan hasta su cumpleaños si hoy no es su cumpleaños usando las nuevas clases de paquete java.time que fueron incluidas 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!"); }
Este es un código que uso para averiguar qué edad tiene algo.
Long time= currentDate.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 la cuestión 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 más temprano 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 hagan explícita la zona horaria que espera / desea.
Utilice un nombre de zona horaria adecuado , estilo de continente / ciudad. Nunca utilice los códigos de 3 a 4 letras como "EST" o "IST".
java.time
El framework java.time ( Tutorial ) integrado en Java 8 y posterior incluye la clase Period
para representar un lapso de tiempo como un número combinado de años, número de meses y número de días.
Puede consultar un Period
para extraer cada uno de esos tres componentes.
El método toString
del período genera por defecto una cadena en el formato definido por ISO 8601 , donde un 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 método 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 la tecnología Java 8, como java.time.
Puede buscar algunos proyectos que backport clases java.time. No sé cuán exitosos son.
Además, puede usar la Joda-Time, una biblioteca de terceros que inspiró el marco java.time (JSR 310). El código Joda-Time debe ser similar al anterior. Excepto que la clase Period tiene una resolución más fina, que va a horas, minutos y segundos. Para truncar los datos adicionales, llame al método withTimeAtStartOfDay
.
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;