У меня есть сортировка по дате, и в моем выпуске я хотел бы отобразить прошедшее время между строками.. вот так..
| Запись № 1 от 08.10.2010 08:34
| Запись № 2 от 08.10.2010 09:45 | 1 час 11 минут со времени предыдущей записи
| Запись № 3 от 08.11.2010 06:57 | 1 день 3 часа 12 минут с предыдущей записи
| Запись №4 от 08.11.2010 20:34 | 13 часов 37 часов после предыдущей записи
| Запись № 5 от 09.11.2011 20:48 | 1 год 1 месяц 8 минут со времени предыдущей записи
Я посмотрел на getRelativeTimeSpanString(), но 1) он вычисляет с этого момента и 2) он добавляет префикс/суффикс.
Есть ли более простой способ сделать это, кроме создания настраиваемого метода датиффа и измельчения всего этого вместе с условиями?
Спасибо заранее.
Я не нашел ничего в Android SDK, который выполняет аналогичную работу (Google включил его в структуру GWT... возможно, его можно было бы взять там).
Но так как это не слишком сложно, я написал сам класс DateUtils, который выполняет аналогичную работу. Мне нравятся дружественные форматы дат, которые также используются в Gmail, например "Вчера" или "2 мин. Назад", а не как дата 13/08/2010 или 10:30 вечера.
В какие временные различия я написал следующее
public static String getDifference(Date sessionStart, Date sessionEnd) {
if(sessionStart == null)
return "[corrupted]";
Calendar startDateTime = Calendar.getInstance();
startDateTime.setTime(sessionStart);
Calendar endDateTime = Calendar.getInstance();
endDateTime.setTime(sessionEnd);
long milliseconds1 = startDateTime.getTimeInMillis();
long milliseconds2 = endDateTime.getTimeInMillis();
long diff = milliseconds2 - milliseconds1;
long hours = diff / (60 * 60 * 1000);
long minutes = diff / (60 * 1000);
minutes = minutes - 60 * hours;
long seconds = diff / (1000);
if (hours > 0) {
return hours + " hours " + minutes + " minutes";
} else {
if (minutes > 0)
return minutes + " minutes";
else {
return seconds + " seconds";
}
}
}
.. и здесь соответствует unit test, чтобы проверить правильность работы:
@Test
public void testGetDifference() {
// hours and minutes
Date startDate = DateUtils.createDateInstance("01.01.2010 12:00:00");
Date endDate = DateUtils.createDateInstance("01.01.2010 13:12:00");
String difference = DateUtils.getDifference(startDate, endDate);
assertNotNull(difference);
assertEquals("1 hours 12 minutes", difference);
// minutes
startDate = DateUtils.createDateInstance("01.01.2010 12:00:00");
endDate = DateUtils.createDateInstance("01.01.2010 12:02:00");
difference = DateUtils.getDifference(startDate, endDate);
assertNotNull(difference);
assertEquals("2 minutes", difference);
// seconds
startDate = DateUtils.createDateInstance("01.01.2010 12:00:00");
endDate = DateUtils.createDateInstance("01.01.2010 12:00:15");
difference = DateUtils.getDifference(startDate, endDate);
assertNotNull(difference);
assertEquals("15 seconds", difference);
difference = DateUtils.getDifference(null, endDate);
assertEquals("[corrupted]", difference);
}
Возможно, вам придется немного настроить его, а также вытеснить жестко закодированные строки ( "часы", "минуты",...), чтобы сделать все проще локализовать (если это проблема для вас).
Как ссылка, возможно, стоит также взглянуть на JodaTime lib. Возможно, у них есть аналогичная реализация, но я не подтвердил это сам (пока).