Как рассчитать прошедшее время с этого момента с помощью Joda-Time?


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

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

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

4 67

4 ответа:

чтобы вычислить прошедшее время с помощью 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

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

использовать 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

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

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

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

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