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

1

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

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

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

Спасибо заранее.

Теги:

1 ответ

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";
        }
    }
}

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

  • 0
    Спасибо за это! .. Я подумал, что мне придется самому что-то взломать .. Ваш код - отличное начало, хотя ... похоже, я должен добавить код дней, недель, месяцев, лет ... ууу! веселье! :п
  • 0
    В итоге я изменил и использовал следующий класс: technojeeves.com/joomla/index.php/free/…
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню