如何用Joda-Time计算从现在开始的经过时间?

fab*_*474 69 java algorithm grails datetime jodatime

我需要计算从特定日期到现在所用的时间,并以与StackOverflow问题相同的格式显示它,即:

15s ago
2min ago
2hours ago
2days ago
25th Dec 08
Run Code Online (Sandbox Code Playgroud)

您知道如何使用Java Joda-Time实现它吗?是否有一个已经实现它的辅助方法,或者我应该自己编写算法?

Bal*_*usC 113

要使用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);
Run Code Online (Sandbox Code Playgroud)

这打印到现在

3 seconds ago
51 minutes ago
7 hours ago
6 days ago
10 months ago
31 years ago

(咳嗽,老了,咳嗽)你看我已经考虑了数月和数年,并将其配置为在零值时省略值.

  • @ fabien7474你是如何调整它只展示一个领域的?请把它作为答案发布. (5认同)
  • 谢谢.我用你的代码作为算法的基础.我基本上显示1个字段的经过时间(或仅2个最大值).如果有人对代码感兴趣,我可以在这里作为答案发布.它也符合i18标准. (2认同)
  • @ fabien7474你真的是如何让它适应只显示一个领域? (2认同)

Jos*_*ter 19

使用PrettyTime进行简单的经过时间.

我尝试了HumanTime,因为@sfussenegger回答并使用了JodaTime,Period但是我发现人类可读时间最简单,最干净的方法是PrettyTime库.

这里有一些带输入和输出的简单示例:

五分钟前

DateTime fiveMinutesAgo = DateTime.now().minusMinutes( 5 );

new PrettyTime().format( fiveMinutesAgo.toDate() );

// Outputs: "5 minutes ago"
Run Code Online (Sandbox Code Playgroud)

不久前

DateTime birthday = new DateTime(1978, 3, 26, 12, 35, 0, 0);

new PrettyTime().format( birthday.toDate() );

// Outputs: "4 decades ago"
Run Code Online (Sandbox Code Playgroud)

小心:我已经尝试过使用图书馆更精确的功能,但它会产生一些奇怪的结果,所以要小心使用它,并在非危及生命的项目中使用它.

J.P


sna*_*ieT 11

您可以使用PeriodFormatter执行此操作,但您不必像在其他答案中那样努力创建自己的PeriodFormatBuilder .如果它适合您的情况,您可以使用默认格式化程序:

Period period = new Period(startDate, endDate);
System.out.println(PeriodFormat.getDefault().print(period))
Run Code Online (Sandbox Code Playgroud)

(就类似的问题给出了这个答案的提示,我为了发现而交叉发布)


sfu*_*ger 8

有一个名为HumanTime的小助手类,我很满意.