Как я вычисляю количество различия лет между 2 датами?

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

14
задан Michaël 30 October 2012 в 15:25
поделиться

2 ответа

Сначала нужно определить, какой из коммитов старше другого. Затем используйте цикл 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

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

Намного более ясно и лаконично, не так ли?

21
ответ дан 1 December 2019 в 08:15
поделиться

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

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

0
ответ дан 1 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: