2016-11-07 9 views
2

私は起床時間が7:45です。これは現地時間だったとき、私は私のコードは、時間の前の瞬間を返すようにしたい特定の時刻に前の瞬間を取得する

私はこれを行うことができます知っている(つまり、前の起床時間を。):

LocalTime wakeUpTime = LocalTime.of(7, 45); 
ZonedDateTime now = ZonedDateTime.now(); 
ZonedDateTime todaysWakeUpTime = now.with(wakeUpTime); 
ZonedDateTime lastWakeUpTime; 

if(todaysWakeUpTime.isAfter(now)){ 
    // e.g. it is now 4:30, so wake-up is still to come, 
    // return the one from yesterday 
    lastWakeUpTime = todaysWakeUpTime.minusDays(1); 
} else { 
    // e.g. it is now 11:30, so wake-up for today is already past 
    lastWakeUpTime = todaysWakeUpTime; 
} 

System.out.println(lastWakeUpTime); 

クリーナーバージョンがあります、例えば時間的なアジャスターを使って、意図をより良く伝える(これらの時間の最後を得る)?コードがように読み取ることができます

+0

あなたがする必要はありませんので、クリーンな方法は、組み込みの機能を持つことになります自分でコード全体を書いてください。もちろん、アジャスターを作成して再利用することもできます(ただし、一時的なアジャスターを含むクラス/メソッドの名前を注意してください。そうしないと、この問題はすべての静的ヘルパークラス/ツールに内在しているため、 。サイドノート:私のタイムライブラリTime4Jはすでにこの機能を(コンパイル時のタイプセーフでも)このボックスでサポートしています。この[要点例](https://gist.github.com/MenoData/4384d9a6d2209a6c5ac8ca4f0cc69bb7) –

答えて

3

TemporalAdjusterを書き込むことができます。

LocalTime wakeUpTime = LocalTime.of(7, 45); 
ZonedDateTime now = ZonedDateTime.now(); 
ZonedDateTime lastWakeUpTime = now.with(previousTime(wakeUpTime)); 

あなたがadjsuterを実装し、静的メソッド記述する必要がどこか:ロジックを実装する

public static TemporalAdjuster previousTime(LocalTime time) { 
    return temporal -> { 
     // logic to find the previous occurrence of the time 
    }; 
} 

は、意思決定が必要になりますLocalDate(時間がないので動作しません)、LocalTime(日付はありません)、ZoneDateTime(DSTの変更について)、Instant(時間帯なしの日付または時刻はありません)。 @JodaStephenの答えに基づいて

0

(!ありがとう)、ここで私の調整は、(参照用)です。

public static TemporalAdjuster previousTime(LocalTime time){ 
    return (temporal) -> { 
     if (temporal instanceof ZonedDateTime) { 
      ZonedDateTime zdt = (ZonedDateTime) temporal; 
      ZonedDateTime newTime = zdt.with(time); 
      if(newTime.isAfter(zdt)){ 
       newTime = newTime.minusDays(1); 
      } 
      return newTime; 
     } else { 
      throw new DateTimeException("This adjuster only handles ZonedDateTime"); 
     } 
    }; 
} 
関連する問題