web-dev-qa-db-ja.com

Java 8のLocalDateTimeを使用して2つの日付の時差を計算する方法は?

多数の回答がありますが、自分の状況に適合するとは思えません。日付の変更だけでなく、8時間の違いも見つける必要があります。時間が8時間を超える場合は、何も実行しないでください。

Java-8のLocalDateTimeで同じことを達成する方法はありますか?

私は以下を使用しようとしましたが、同じことを達成できませんでした。

LocalDateTime fromDateTime = LocalDateTime.of(2017, 07, 07, 07, 00, 55);
LocalDateTime toDateTime = LocalDateTime.now();
LocalDateTime tempDateTime = LocalDateTime.from(fromDateTime);

long years = tempDateTime.until(toDateTime, ChronoUnit.YEARS);
tempDateTime = tempDateTime.plusYears(years);

long months = tempDateTime.until(toDateTime, ChronoUnit.MONTHS);
tempDateTime = tempDateTime.plusMonths(months);

long days = tempDateTime.until(toDateTime, ChronoUnit.DAYS);
tempDateTime = tempDateTime.plusDays(days);

long hours = tempDateTime.until(toDateTime, ChronoUnit.HOURS);
tempDateTime = tempDateTime.plusHours(hours);

long minutes = tempDateTime.until(toDateTime, ChronoUnit.MINUTES);
tempDateTime = tempDateTime.plusMinutes(minutes);

long seconds = tempDateTime.until(toDateTime, ChronoUnit.SECONDS);

System.out.println("" + Java.time.Duration.between(tempDateTime, toDateTime).toHours());

System.out.println(years + " years "
        + months + " months "
        + days + " days "
        + hours + " hours "
        + minutes + " minutes "
        + seconds + " seconds.");

時刻と日付を別々に確認することは困難です。

最初は次のようにコーディングしましたが、正しく見えません:

return openBrat!=null 
        && openBrat.until(LocalDateTime.now(), ChronoUnit.DAYS) == 0 &&  
          openBrat.until(LocalDateTime.now(), ChronoUnit.HOURS) >= 8
         && openBrat.until(LocalDateTime.now(), ChronoUnit.Minutes) >= 0;

誰でも減算する方法を提案してください:

2017 07 06 23:30:00 - 2017 07 07 01:30:00 - Should return 2 hours.
7
Harpreet

次の印刷2、あなたが期待するように。

LocalDateTime ldt1 = LocalDateTime.of(2017, 07, 06, 23, 30, 00);
LocalDateTime ldt2 = LocalDateTime.of(2017, 07, 07, 1, 30, 00);
System.out.println(Duration.between(ldt1, ldt2).toHours());

コードに問題はありません。期待した結果が得られない場合は、期待が正しいかどうかを確認する必要があります。


差が8時間未満のときに何かを行うには、次のようにします。

LocalDateTime ldt1 = LocalDateTime.of(2017, 07, 06, 23, 30, 00);
LocalDateTime ldt2 = LocalDateTime.of(2017, 07, 07, 1, 30, 00);
Duration d1 = Duration.between(ldt1, ldt2);
Duration d2 = Duration.ofHours(8);

if (d1.compareTo(d2) > 0) {
    System.out.println("do nothing");
} else {
    System.out.println("do something");
}
15
Robin Topper

私の理解では、これら2つの日付の差を取得して、この差が何時間、分、秒であるかという点で「ブレーク」したいということです。

すでに説明したように、Durationクラスを使用できます。ただし、Durationは秒とナノ秒の差を計算するため、この秒数を個別のフィールドで取得するには、いくつかの計算を行う必要があります。

_LocalDateTime d1 = LocalDateTime.of(2017, 7, 6, 23, 30, 0);
LocalDateTime d2 = LocalDateTime.of(2017, 7, 7, 7, 0, 55);

Duration duration = Duration.between(d1, d2);
// total seconds of difference (using Math.abs to avoid negative values)
long seconds = Math.abs(duration.getSeconds());
long hours = seconds / 3600;
seconds -= (hours * 3600);
long minutes = seconds / 60;
seconds -= (minutes * 60);
System.out.println(hours + " hours " + minutes + " minutes " + seconds + " seconds");
_

Java 9以降では、新しい_Duration::to…Part_メソッドを呼び出して 日、時間、分、秒の数を取得 自分で数値を計算するのではなく。

出力は次のようになります。

7時間30分55秒

また、変数hoursminutes、およびsecondsは、それぞれ_7_、_30_、および_55_の値を持ちます。ナノ秒も必要な場合は、duration.getNano()を呼び出してそれぞれの値を取得します(上記の例では、_0_です)。

異なる値でテストする場合:

_LocalDateTime d1 = LocalDateTime.of(2017, 7, 6, 23, 30, 0);
LocalDateTime d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0);
_

結果は次のようになります。

2時間0分0秒


時間の差だけが必要な場合は、次を使用できます。

_ChronoUnit.HOURS.between(d1, d2);
_

オプションで_Math.abs_を使用して、負の値を回避できます。

これは、残りの分と秒を無視して、時間の差を返します。最初の例(d2 = LocalDateTime.of(2017, 7, 7, 7, 0, 55))では_7_を返し、2番目の例では(d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0))を返します_2_を返します。

8
user7605325