2017-04-12 4 views
1

時間差を分単位で計算したいだけです。 だから私はウェブサイトから取得した値を(例えば:でのイベント開始を:20時30午前3時30を終了)時間と分だけです。Java - 時間差に特化したシナリオを計算する

「Duration.between」を使用すると、不正な値が返されます。最初の値が2番目または2番目の値より大きい場合、または2番目の値が深夜を過ぎたときに発生しています。 私は 'ifs'と'elses 'でこれを行うことができると思いますが、もっと優雅な方法で問題を解決するクラスや方法がすでにあると確信していますが、見つけられません。 は、ここに私のコードです:それは第二の値が最初のものよりも大きいときにのみ動作します。この場合は

 LocalTime eventStarts = LocalTime.now(); 
     LocalTime eventEnds = LocalTime.now(); 
     eventStarts = eventStarts.withHour(22).withMinute(00); 
     eventEnds = eventEnds.withHour(03).withMinute(00); 

     Duration durationBetweenEvents = Duration.between(eventStarts, eventEnds); 


     System.out.println(durationBetweenEvents.toMinutes()); 

は私が得る「-1140」

+0

'eventEnds = eventEnds.withHour(03).withMinute(00)'は、同じ日に 'eventStarts'を設定した同じ日の前の時刻に終了時刻を設定します。したがって、あなたの終了時刻はあなたの開始時刻よりも意図的に早くなります。 –

答えて

1

はちょうどあなたのコードに以下を追加します。

夏時間には少し注意する必要があります。夏時間が開始または終了すると、計算が1時間になることがあります。しかし、日付やタイムゾーン情報を知らなくても、それに対処する方法はありません。

+0

恥ずかしい、とにかく感謝:) –

1

必要性は

LocalTimeは、日付または日の概念を持っていない&タイムゾーンをさかのぼります。したがって、1回の一般的な24時間の1日に限定されます。夕方から午前の時間に行くことは、時間が逆行していると見られ、日が存在しないため、別の日に回り込むことはありません。

実際のイベントの期間を知るには、日付と時間帯が必要です。

現在の日付を取得するには、タイムゾーンが必要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。

日付を取得したら、ZoneIdを適用してZonedDateTimeオブジェクトを取得します。そこから、夏時間(DST)などの異常を考慮に入れてDurationを得ることができます。

ZoneId z = ZoneId.of("America/Montreal"); 

LocalDate today = LocalDate.now(z); 
LocalDate tomorrow = today.plusDays(1); 

ZonedDateTime zdtStart = 
    ZonedDateTime.of(today , LocalTime.parse("20:30") , z) ; 
ZonedDateTime zdtStop = 
    ZonedDateTime.of(tomorrow , LocalTime.parse("03:30") , z) ; 

Duration d = Duration.between(zdtStart , zdtStop) ; 

long totalMinutes = d.toMinutes() ; 

zdtStart.toString():2017-04-13T20:30から04:00 [アメリカ/モントリオール]

zdtStop.toString():2017-04-14T03:30から04 :00 [アメリカ/モントリオール]

d.toString():PT7H

totalMinutes:420

このを参照してください。

+0

OPは "私がウェブサイトから得た値は時間と分だけです..."と書いていますので、これはそれをカットするつもりはありません。 –