2010-08-13 2 views
1

Я БД отсортированы по дате, и в моем выходе, я хотел бы, чтобы отобразить истекшее время между рядами .. как это ..Есть ли функция для вычисления разницы между двумя временами и отображения относительного результата?

| Запись № 1 от 08/10/2010 08:34

| Запись № 2 от 10.08.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) он добавляет префикс/суффикс.

Есть ли более простой способ сделать это, кроме создания пользовательского метода датиффа и измельчения всего этого вместе с условиями самостоятельно?

Заранее спасибо.

ответ

9

Я ничего не нашел в 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"; 
     } 
    } 
} 

..и здесь является модульного тестирования в соответствии проверить правильность работы:

@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. Возможно, они имеют аналогичную реализацию, но я не подтвердил это сам (пока).

+0

Спасибо за это! .. Я подумал, что мне придется взломать что-то вместе. Ваш код - отличное начало, но .. просто похоже, что мне нужно добавить дни, недели, месяцы, годы кода .. yay! весело! : p – kefs

+0

В результате я изменил и использовал следующий класс: http://www.technojeeves.com/joomla/index.php/free/71-difference-between-two-dates-in-java – kefs

+0

Nice. Как примечание. Напишите единичный тест вместо фиктивной основной() печати на консоль. Таким образом, у вас уже есть проверка того, работает ли ваш код правильно :) – Juri

Смежные вопросы