2016-11-07 83 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(沒有日期或沒有時區的時間)。 (!感謝)

0

基礎上@JodaStephen的答案,這裏是我的調整(僅供參考):

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"); 
     } 
    }; 
} 
相關問題