2017-07-07 22 views
3

多くの回答がありますが、私の状況に適合するものは見つかりません。私は8時間と日付変更の違いを見つける必要があります。時間が8時間以上の場合は、何かを実行しないでください。Java 8でLocalDateTimeを使用して2つの日付の時間差を計算する方法は?

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."); 

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

は当初、私はそれが好きでコード化されたが、それは正しく見えるしません:あなたが期待ちょうど同じように、2

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

また、 'ChronoUnit.HOURS.between(date1、date2)'を使用することもできます。 –

+3

'LocalDateTime'は意図的にタイムゾーンの概念を持っていません。そのクラスを使用すると、夏時間(DST)などの異常を無視することになります。そのような現実を考慮するには、 'ZonedDateTime'を使います。 –

+0

[Java 8:2つのLocalDateTimeの差分を計算する]の可能な複製(https://stackoverflow.com/questions/25747499/java-8-calculate-difference-between-two-localdatetime) – rogerdpack

答えて

6

次のプリントを:

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

誰もが同じよう減算する方法を提案してもらえます。

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()); 

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

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"); 
} 
+0

時間単位で確認する方法秒ですか? 条件チェックでは、時間が8時間を超えると、何かを実行します。=と>はtoHoursでは動作しますが、分や秒では動作しません。 – Harpreet

+1

@Harpreetしたがって、必要な秒数、またはミリ秒単位の時間を取得し、秒(またはミリ秒など)の8時間を超えるかどうかを確認します。 –

+0

@Harpreet少しの余分なコードで私の答えを更新しました –

5

私の理解では、あなたがそれらの2つの日付と「休憩の間の差を取得したいということです:差が8時間未満であるとき


あなたはこのような何かを行うことができ、何かをするために、この相違点は何時間、何分、何秒であるのかという点で言えます。

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

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"); 

以降では、新しいDuration::to…Partを呼び出すことができます自分で数値を計算するのではなく、get number of days, hours, minutes, or secondsに送信してください。

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

7時間30分55秒

と変数hoursminutesseconds73055のそれぞれの値を持つことになります。ナノ秒も必要な場合は、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を返し、第二の例(d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0))には2を返します。

関連する問題