web-dev-qa-db-ja.com

Joda-Timeでこれからの経過時間を計算する方法は?

特定の日付から現在までの経過時間を計算し、StackOverflowの質問と同じ形式で表示する必要があります。

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

JavaJoda-Time library)でそれを達成する方法を知っていますか?既にそれを実装しているヘルパーメソッドがありますか、それとも自分でアルゴリズムを書くべきですか?

68
fabien7474

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秒前
 51分前
 7時間前
 6日前
 10か月前
 31年前

(咳、古い、咳) 月と年も考慮に入れており、値がゼロの場合は値を省略するように構成していることがわかります。

113
BalusC

PrettyTime を単純な経過時間に使用します。

@-sfusseneggerが答えてJodaTimeのPeriodを使用して HumanTime を試しましたが、人間が読める経過時間の最も簡単でクリーンな方法は PrettyTime ライブラリ。

次に、入力と出力を使用した簡単な例をいくつか示します。

5分前

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

19
Joshua Pinter

PeriodFormatterを使用してこれを行うことができますが、 その他の回答 のように独自のPeriodFormatBuilderを作成する努力をする必要はありません。ケースに合う場合は、デフォルトのフォーマッターを使用できます。

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

この答え へのヒントは、同様の質問について、発見しやすいようにクロスポストしています)

10
snappieT

HumanTime と呼ばれる小さなヘルパークラスがあり、これにはかなり満足しています。

7
sfussenegger