如何计算从现在的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的小辅助类,我很满意。