3

私は開発の途中で立ち往生しました.2つの日付間の遅延を見つける必要があるような方法で要件があります..currentdate-date from database

の形式で遅延を表示する必要がありますdd:hh:mm。多くの参照を参照した後、個々のミリ秒の時間と分に変換する方法を見つけましたが、結果が X ミリ秒の場合、適切な日分と秒の形式で表示する必要があります

例: 2日:03分:46秒

使用しているコードは次のとおりです。

Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar1.setTime(date);
calendar2.setTime(date1);
long milliseconds1 = calendar1.getTimeInMillis();
long milliseconds2 = calendar2.getTimeInMillis();
long diff = milliseconds1 - milliseconds2;
System.out.println("diff ::"+diff);
long diffSeconds = diff / 1000;
long diffMinutes = diff / (60 * 1000);
long diffHours = diff / (60 * 60 * 1000);
long diffDays = diff / (24 * 60 * 60 * 1000);

誰かが私にさらに何をすべきか提案してもらえますか? 私を案内してください..

4

6 に答える 6

8

Joda Timeを使用します。Java API には、「2 つの日付/時刻値の差」を扱うものは含まれていません。PeriodJoda Time では、 (実際にはカレンダー中心の差) とDuration(実際には単なる経過時間差) のいずれかを選択できます。

理想的には、すべての日付/時刻に関する問題に Joda Time を使用します。これは、はるかに優れた API です。

この場合、論理的にはを持っていると思われますが、文字列変換に a を使用するには、Durationそれを に変換する必要があります。PeriodPeriodFormatter

于 2012-11-26T09:27:49.447 に答える
3

最初に計算する必要がありますdiffDays

diffDays = diff / (24 * 60 * 60 * 1000);

次に、残りのミリ秒を計算します。

diff -= diffDays * 24 * 60 * 60 * 1000;

新しい diff を使用して diffHours などを計算します...

提案: 次のような定数値を使用します。

private static final int SECOND = 1000;
private static final int MINUTE = 60 * SECOND;
// and so on
于 2012-11-26T09:28:18.177 に答える
1

-Joda日時の問題に対処するときは、ライブラリを使用することをお勧めします。

Joda Timeには、時間間隔の概念があります。

Interval interval = new Interval(oldTime, new Instant());

ちなみに、Jodaには2つの概念があります。2つの時点の間の時間間隔を表す間隔(午前8時から午前10時までの時間を表す)と、実際の時間境界のない時間の長さを表す期間(たとえば、2時間を表す)です。

于 2012-11-26T09:33:04.887 に答える
1

JodaTimeを使用すると、これは本当に簡単です。次のコードを参照してください。

public void testJoda() {
    DateTime then = new DateTime("2012-03-23T02:30:00.000");
    DateTime now = new DateTime("2012-03-24T02:29:00.000");

    DurationFieldType[] ddhhmm = { DurationFieldType.days(),
            DurationFieldType.hours(), DurationFieldType.minutes() };
    Period p = new Period(then, now, PeriodType.forFields(ddhhmm));
    System.out.println(p.toString());

    p = new Period(then, now, PeriodType.days());
    System.out.println(p.toString());

    p = new Period(then, now, PeriodType.hours());
    System.out.println(p.toString());

    DurationFieldType[] hhmm  = { DurationFieldType.hours(), DurationFieldType.minutes() };
    p = new Period(then, now, PeriodType.forFields(hhmm));
    System.out.println(p.toString());
}

23時間59分間隔でテストします。その出力は期待どおりです。

PT23H59M
P0D
PT23H
PT23H59M

1日後、3月25日の春の夏時間のジャンプの前後に同じ間隔を取ります。

DateTime then = new DateTime("2012-03-24T02:30:00.000");
DateTime now = new DateTime("2012-03-25T03:29:00.000");

そしてあなたは正しく得ます:

P1DT-1M
P1D
PT23H
PT23H59M

本当に、それよりもはるかに簡単になることはありません。

于 2012-11-27T18:10:39.683 に答える
0
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar1.setTime(date);
calendar2.setTime(date1);

int dayDiff = calendar1.get(Calendar.DAY_OF_MONTH) - calendar2.get(Calendar.DAY_OF_MONTH);  
int hourDiff = calendar1.get(Calendar.HOUR_OF_DAY) -calendar2.get(Calendar.HOUR_OF_DAY);   
int dayDiff = calendar1.get(Calendar.SECOND) - calendar2.get(Calendar.SECOND);
于 2012-11-26T09:32:04.073 に答える