Как рассчитать истекшее время с Joda-Time?

Мне нужно рассчитать время, прошедшее с одной конкретной даты до настоящего времени, и отобразить его в том же формате, что и вопросы StackOverflow, т.е.

15s ago
2min ago
2hours ago
2days ago
25th Dec 08

Знаете ли вы, как это сделать с помощью библиотеки Joda-Time? Есть ли вспомогательный метод, который уже реализует его, или я должен сам написать алгоритм?

Ответ 1

Чтобы вычислить прошедшее время с помощью JodaTime, используйте Period. Чтобы отформатировать прошедшее время в желаемом представлении человека, используйте PeriodFormatter, который вы можете создать с помощью PeriodFormatterBuilder.

Вот пример запуска:

DateTime myBirthDate = new DateTime(1978, 3, 26, 12, 35, 0, 0);
DateTime now = new DateTime();
Period period = new Period(myBirthDate, now);

PeriodFormatter formatter = new PeriodFormatterBuilder()
    .appendSeconds().appendSuffix(" seconds ago\n")
    .appendMinutes().appendSuffix(" minutes ago\n")
    .appendHours().appendSuffix(" hours ago\n")
    .appendDays().appendSuffix(" days ago\n")
    .appendWeeks().appendSuffix(" weeks ago\n")
    .appendMonths().appendSuffix(" months ago\n")
    .appendYears().appendSuffix(" years ago\n")
    .printZeroNever()
    .toFormatter();

String elapsed = formatter.print(period);
System.out.println(elapsed);

Теперь это отпечаток

3 seconds ago
51 minutes ago
7 hours ago
6 days ago
10 months ago
31 years ago

(Кашель, старый, кашель) Вы видите, что я взял месяцы и годы в расчет и настроил его, чтобы опустить значения, когда они равны нулю.

Ответ 2

Используйте PrettyTime для простого прошедшего времени.

Я попробовал HumanTime, когда @sfussenegger ответил и использовал JodaTime Period но самым простым и чистым методом для удобочитаемого человеком прошедшего времени, который я нашел, была библиотека PrettyTime.

Вот пара простых примеров с вводом и выводом:

Пять минут назад

DateTime fiveMinutesAgo = DateTime.now().minusMinutes( 5 );

new PrettyTime().format( fiveMinutesAgo.toDate() );

// Outputs: "5 minutes ago"

Аго назад

DateTime birthday = new DateTime(1978, 3, 26, 12, 35, 0, 0);

new PrettyTime().format( birthday.toDate() );

// Outputs: "4 decades ago"

ВНИМАНИЕ: Я попытался поиграть с библиотекой более точной функциональностью, но она дает некоторые странные результаты, поэтому используйте ее с осторожностью и в не угрожающих жизни проектах.

JP

Ответ 3

Вы можете сделать это с помощью параметра PeriodFormatter, но вам не нужно прилагать усилия к тому, чтобы сделать свой собственный PeriodFormatBuilder, как в других ответах. Если это подходит вашему делу, вы можете просто использовать форматтер по умолчанию:

Period period = new Period(startDate, endDate);
System.out.println(PeriodFormat.getDefault().print(period))

(подсказка для шляпы этот ответ по аналогичному вопросу, я перекрестно размещаюсь для обнаружения)

Ответ 4

Существует небольшой вспомогательный класс HumanTime, который мне очень нравится.