Как рассчитать истекшее время с 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, который мне очень нравится.