Помимо вышеупомянутого великолепного JodaTime API, который я делаю , я рекомендую лучшую стандартную альтернативу Java, которую вы можете иметь, это java.util.Calendar
. Работать с ним громоздко (это преуменьшение ... посмотрите на примеры JodaTime из одной строки здесь), но вы также можете рассчитать прошедшее время с ним. Важным ключом является то, что вы должны использовать Calendar#add()
в цикле, чтобы получить истекшее значение для лет, месяцев и дней, чтобы принять во внимание високосные дни, годы и столетия. Вы не должны рассчитывать их обратно из (милли) секунд.
Вот базовый пример:
import java.util.Calendar;
public class Test {
public static void main(String[] args) throws Exception {
Calendar start = Calendar.getInstance();
start.set(1978, 2, 26, 12, 35, 0); // Just an example.
Calendar end = Calendar.getInstance();
Integer[] elapsed = new Integer[6];
Calendar clone = (Calendar) start.clone(); // Otherwise changes are been reflected.
elapsed[0] = elapsed(clone, end, Calendar.YEAR);
clone.add(Calendar.YEAR, elapsed[0]);
elapsed[1] = elapsed(clone, end, Calendar.MONTH);
clone.add(Calendar.MONTH, elapsed[1]);
elapsed[2] = elapsed(clone, end, Calendar.DATE);
clone.add(Calendar.DATE, elapsed[2]);
elapsed[3] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 3600000;
clone.add(Calendar.HOUR, elapsed[3]);
elapsed[4] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 60000;
clone.add(Calendar.MINUTE, elapsed[4]);
elapsed[5] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 1000;
System.out.format("%d years, %d months, %d days, %d hours, %d minutes, %d seconds", elapsed);
}
private static int elapsed(Calendar before, Calendar after, int field) {
Calendar clone = (Calendar) before.clone(); // Otherwise changes are been reflected.
int elapsed = -1;
while (!clone.after(after)) {
clone.add(field, 1);
elapsed++;
}
return elapsed;
}
}
Это должно напечатать мой возраст на данный момент =)
О, я должен добавить, вы можете "конвертировать" Date
в Calendar
, используя Calendar#setTime()
.