2010-05-17 4 views

ответ

21

Сначала вам нужно определить, какой из них старше другого. Затем используйте цикл while, в котором вы тестируете, если старший не after() более новый. Вызовите Calendar#add() с одним (1) Calendar.YEAR на старом, чтобы добавить годы. Держите счетчик, чтобы подсчитать годы.

Kickoff пример:

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 

Это говорит, что Date и Calendar API, в Java SE на самом деле являются эпические неудачи. Появился новый API Date при планировании предстоящей Java 8, JSR-310, который очень похож на Joda-Time. Как сейчас вы можете рассмотреть Joda-Time, так как это действительно облегчает вычисления/модификации даты и времени. Вот пример использования 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 

Гораздо более понятный и лаконичный, не так ли?

+6

или Years.yearsBetween (myBirthDate, сейчас) .getYears(); – mtpettyp

+0

Я не могу создать объект периода. Кажется, что я закрыт под java.util.time ... вы можете помочь мне, пожалуйста, как я могу найти разницу в году с помощью Period ?? –

+0

@ Mr.Noddy: фрагмент кода - это JodaTime, а не JavaTime. В JavaTime используйте 'Period # between()'. См. Также javadoc https://docs.oracle.com/javase/8/docs/api/java/time/Period.html – BalusC

0

Или вы могли бы просто использовать Calendar.getTimeInMillis():

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

Редактировать Это игнорирует високосными. Но если вы ищете целочисленное представление количества лет, то високосные годы не имеют значения для периодов, которые меньше половины тысячелетия или около того.

Это, пожалуй, большая точность для расчета чей-то возраста. Но не достаточно точно, чтобы рассказать о своем дне рождения.

Если вам нужна ваша разница в году более точная, чем до трех значащих цифр в течение жизни человека (приблизительно 80,00 лет против 80,05), вы должны использовать «официальное» решение.

Если нет, нет особых причин для дополнительных усилий для определенной точности, которую вы не собираетесь использовать.

+3

Имеет ли этот счет високосные годы, прыжки минут и т. Д.? –

+0

Nope. Предполагая, что если вы ищете несколько лет, вы не слишком беспокоитесь о несоответствии дня или двух. Если вы посмотрите точную длину года в Википедии, вы можете получить ее как можно ближе к вам в долгосрочной перспективе. –

+0

@ Ник: прыжок * минуты * ?? –

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

Это позволяет избежать зацикливания и быть точным на весь день.

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

(java.lang.Math)

+3

Примечание: Остерегайтесь високосных годов и других подобных календарных странностей. – michaelb958

Смежные вопросы