Есть ли функция для расчета разницы между двумя значениями и отображения относительного результата? - PullRequest
1 голос
/ 13 августа 2010

У меня есть БД, отсортированная по дате, и в моих выходных данных я хотел бы отобразить прошедшее время между строками .. вот так ..

|Запись № 1 от 10.08.2010 08:34

|Запись № 2 от 10.08.2010 09:45 |1 час 11 минут с предыдущей записи

|Запись № 3 от 11.08.2010 06:57 |1 день 3 часа 12 минут с момента предыдущей записи

|Запись № 4 от 11.08.2010 20:34 |13 часов 37 часов с момента предыдущей записи

|Запись № 5 от 11.09.2011 20:48 |1 год 1 месяц 8 минут с момента предыдущей записи

Я смотрел на getRelativeTimeSpanString (), но 1) он рассчитывает сейчас и 2) добавляет префикс / суффикс.

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

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

1 Ответ

9 голосов
/ 13 августа 2010

Я не нашел ничего в Android SDK, который бы выполнял аналогичную работу (Google включил один в платформу GWT ... возможно, его можно было бы там взять).

Но так как это не так уж сложно, я сам написал класс DateUtils, который выполняет аналогичную работу. Мне нравятся удобные форматы дат, которые также используются в Gmail, например, «Вчера» или «2 минуты назад», а не даты, такие как 13.08.2010 или 22: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 lib. Возможно, у них похожая реализация, но я сам не проверял (пока).

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