Как рассчитать разницу в количестве лет между двумя датами? - PullRequest
14 голосов
/ 17 мая 2010

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

Ответы [ 4 ]

21 голосов
/ 17 мая 2010

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

Пример запуска:

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

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

10 голосов
/ 09 апреля 2012
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 голосов
/ 03 июня 2013
double diff = d2.getTime() - d1.getTime();
double d = 1000 * 60 * 60 * 24 * 365;
return (int) Math.round(diff / d);

(java.lang.Math)

0 голосов
/ 17 мая 2010

Или вы можете просто использовать 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), вам следует использовать «официальное» решение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...