Как рассчитать прошедшее время с этого момента с помощью Joda-Time?
Мне нужно вычислить время, прошедшее с одной конкретной даты до сих пор и отображать его в том же формате, что и вопросы StackOverflow, т. е.:
15s ago
2min ago
2hours ago
2days ago
25th Dec 08
знаете ли вы, как добиться этого с помощью Java Joda Времени библиотека? Есть ли вспомогательный метод, который уже реализует его, или я должен написать алгоритм сам?
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 что я очень доволен.