2010-05-17 22 views

risposta

21

Per prima cosa è necessario determinare quale è più vecchio dell'altro. Quindi utilizzare un ciclo while in cui si verifica se il più vecchio non è after() quello più recente. Richiama Calendar#add() con uno (1) Calendar.YEAR sul vecchio per aggiungere gli anni. Mantieni un contatore per contare gli anni.

Kickoff esempio:

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 

Detto questo, il Date e Calendar API di Java SE sono in realtà fallimenti epici. C'è una nuova API Date nella pianificazione del prossimo Java 8, lo JSR-310 che è molto simile a Joda-Time. Per ora puoi prendere in considerazione Joda-Time poiché facilita davvero i calcoli/le modifiche Data/Ora come questo. Ecco un esempio utilizzando 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 

Molto più chiaro e conciso, non è vero?

+6

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

+0

non riesco a creare l'oggetto del periodo. Sembra essere privato sotto java.util.time ... puoi aiutarmi, per favore come posso trovare la differenza dell'anno usando Periodo ?? –

+0

@ Mr.Noddy: lo snippet di codice è JodaTime non JavaTime. In JavaTime, usa 'Periodo # tra()'. Vedi anche javadoc https://docs.oracle.com/javase/8/docs/api/java/time/Period.html – BalusC

0

Oppure si può semplicemente utilizzare Calendar.getTimeInMillis():

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

Modifica Questo ignora gli anni bisestili. Ma se stai cercando una rappresentazione intera del numero di anni in cui gli anni bisestili sono irrilevanti per periodi inferiori a mezzo millennio circa.

Questo è un sacco di esattezza per il calcolo dell'età di qualcuno, per esempio. Ma non abbastanza preciso da dire il loro compleanno.

Se è necessaria la differenza dell'anno più precisa rispetto a tre cifre significative all'interno di una vita umana (circa 80,00 anni rispetto a 80,05), è necessario utilizzare la soluzione "ufficiale".

In caso contrario, non vi è alcun motivo particolare per aumentare lo sforzo per un livello di precisione che non si intende utilizzare.

+3

Questo account è valido per gli anni bisestili, i minuti bisestili, ecc.? –

+0

No. Supponendo che se cerchi multipli di anni, non sei eccessivamente preoccupato per un giorno o due di disallineamento. Se cerchi la lunghezza esatta dell'anno in Wikipedia, puoi ottenerla il più vicino possibile a lungo termine. –

+0

@Nick: salto * minuti * ?? –

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--; 
} 

Ciò evita il looping e dovrebbe essere preciso per il giorno.

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: Attenzione agli anni bisestili e ad altre stranezze del calendario. – michaelb958

Problemi correlati