Как рассчитать прошедшее время с помощью Joda-Time? - PullRequest
68 голосов
/ 01 февраля 2010

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

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

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

Ответы [ 4 ]

112 голосов
/ 01 февраля 2010

Чтобы рассчитать истекшее время с 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

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

19 голосов
/ 17 августа 2014

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

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

Вот несколько простых примеров с вводом и выводом:

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

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

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

// Outputs: "5 minutes ago"

Ago Ago

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

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

// Outputs: "4 decades ago"

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

JP

10 голосов
/ 07 февраля 2014

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

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

(подсказка к этому ответу на похожий вопрос, я кросс-пост для поиска)

7 голосов
/ 01 февраля 2010

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

...