2010-05-17 14 views

Respuesta

21

Primero debe determinar cuál es más antiguo que el otro. Luego haga uso de un while loop donde prueba si el anterior no es after() el más nuevo. Invoque Calendar#add() con uno (1) Calendar.YEAR en el anterior para agregar los años. Mantenga un contador para contar los años.

ejemplo Comienzo:

Calendar myBirthDate = Calendar.getInstance(); 
myBirthDate.clear(); 
myBirthDate.set(1978, 3 - 1, 26); 
Calendar now = Calendar.getInstance(); 
Calendar clone = (Calendar) myBirthDate.clone(); // Otherwise changes are been reflected. 
int years = -1; 
while (!clone.after(now)) { 
    clone.add(Calendar.YEAR, 1); 
    years++; 
} 
System.out.println(years); // 32 

Dicho esto, el DateCalendar y API de Java SE en realidad son fracasos épicos. Hay una nueva API de fecha en la planificación de la próxima Java 8, la JSR-310 que es muy similar a Joda-Time. Hasta ahora, es posible que desee considerar Joda-Time, ya que realmente facilita los cálculos/modificaciones de fecha/hora como este. Aquí hay un ejemplo usando Joda-Time:

DateTime myBirthDate = new DateTime(1978, 3, 26, 0, 0, 0, 0); 
DateTime now = new DateTime(); 
Period period = new Period(myBirthDate, now); 
int years = period.getYears(); 
System.out.println(years); // 32 

Mucho más claro y conciso, no es así?

+6

o Years.yearsBetween (myBirthDate, ahora) .getYears(); – mtpettyp

+0

no puedo crear el objeto del período. Parece ser privado en java.util.time ... ¿me pueden ayudar, por favor, cómo puedo encontrar la diferencia del año usando Period? –

+0

@ Mr.Noddy: el fragmento de código es JodaTime no JavaTime. En JavaTime, use 'Periodo # entre()'. Ver también javadoc https://docs.oracle.com/javase/8/docs/api/java/time/Period.html – BalusC

0

O usted podría utilizar Calendar.getTimeInMillis():

long msYear = 1000L * 60 * 60 * 24 * 365; 
long msDiff = c2.getTimeInMillis() - c1.getTimeInMillis(); 
System.out.println("Years diff: " + String.valueOf(msDiff/msYear)); 

Editar Esto ignora los años bisiestos. Pero si busca una representación entera del número de años, los años bisiestos son irrelevantes por períodos inferiores a medio milenio más o menos.

Esto es bastante exacto para calcular la edad de alguien, por ejemplo. Pero no es lo suficientemente preciso como para contar su cumpleaños.

Si necesita su diferencia de año más exacta que tres dígitos significativos dentro de una vida humana (aproximadamente 80.00 años vs 80.05), debe usar la solución "oficial".

De lo contrario, no hay ninguna razón en particular para esforzarse más por un grado de precisión que no va a utilizar.

+3

¿Esto cuenta para los años bisiestos, los minutos bisiestos, etc.? –

+0

No. Suponiendo que si está buscando múltiples años, no está demasiado preocupado por uno o dos días de desajuste. Si busca la longitud exacta del año en Wikipedia, puede obtenerla lo más cerca que desee a la larga. –

+0

@Nick: salto * minutos * ?? –

10
Calendar dobDate; // Set this to date to check 
Calendar today = Calendar.getInstance(); 
int curYear = today.get(Calendar.YEAR); 
int curMonth = today.get(Calendar.MONTH); 
int curDay = today.get(Calendar.DAY_OF_MONTH); 

int year = dobDate.get(Calendar.YEAR); 
int month = dobDate.get(Calendar.MONTH); 
int day = dobDate.get(Calendar.DAY_OF_MONTH); 

int age = curYear - year; 
if (curMonth < month || (month == curMonth && curDay < day)) { 
    age--; 
} 

Esto evita los bucles y debe ser preciso para el día.

2
double diff = d2.getTime() - d1.getTime(); 
double d = 1000 * 60 * 60 * 24 * 365; 
return (int) Math.round(diff/d); 

(java.lang.Math)

+3

Nota: Tenga cuidado con los años bisiestos y otras rarezas del calendario. – michaelb958

Cuestiones relacionadas