Как рассчитать количество лет между двумя датами?

Как вычислить количество различий между двумя календарями в Java?

Ответы

Ответ 1

Сначала вам нужно определить, какой из них старше другого. Затем используйте цикл while, в котором вы проверяете, является ли старший старше after() более новым. Invoke 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

Тем не менее, API Date и Calendar в Java SE на самом деле являются эпическими неудачами. Там появился новый API даты при планировании предстоящей 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

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

Ответ 2

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

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

Ответ 3

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

(java.lang.Math)

Ответ 4

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

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

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

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

Если вам нужна ваша разница в году более точно, чем до трех значащих цифр в течение жизни человека (приблизительно 80.00 лет против 80.05), вы должны использовать "официальное" решение.

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