如何计算从现在的Joda时间stream逝的时间?

我需要计算从一个特定date到现在的时间,并显示与StackOverflow问题相同的格式,即:

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

你知道如何用Java Joda-Time库实现它吗? 那里是否有一个已经实现的辅助方法,或者我应该自己写algorithm?

要使用JodaTime计算已用时间,请使用Period 。 要在所需的人工表示中格式化已用时间,请使用PeriodFormatter构build的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秒前
 51分钟前
 7小时前
 6天前
 10个月前
 31年前

(咳嗽,老,咳嗽)你看,我已经考虑了几个月和几年,并configuration为零时,省略值。

将PrettyTime用于简单的消耗时间。

我尝试了HumanTime,因为@sfussenegger回答并使用了JodaTime的Period但是我发现的最简单和最干净的方法是我发现的PrettyTime库。

这里有几个input和输出的简单例子:

五分钟前

 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" 

小心:我尝试过使用库的更精确的function,但会产生一些奇怪的结果,请小心使用。

J.P

你可以用PeriodFormatter来做到这一点,但是你不必像在其他答案中一样去做自己的PeriodFormatBuilder。 如果它适合你的情况,你可以使用默认的格式化程序:

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

(关于类似的问题, 这个答案的帽子提示,我交叉发现的可发现性)

有一个叫做HumanTime的小辅助类,我很满意。