2016-11-07 3 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); 

는 청소기 버전이 있습니다 :이 현지 시간 (. 즉, 이전의 웨이크 업 시간)

나는이 작업을 수행 할 수 있습니다 알고 때 내 코드는 시간에 이전의 순간을 반환하려면 , 예. 시간 조정자를 사용하여 의도를 더 잘 전달합니다 (이 시간의 마지막 시간을 얻음)?

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

결정을 필요로 논리를 구현 :

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

어딘가에 당신이 adjsuter를 구현하는 정적 메소드를 작성해야합니다

+0

기능을 내장하여 당신이 필요가 없습니다 낳게 될 것이다 가장 깨끗한 방법 너 자신 전체 코드를 작성하십시오. 물론 조정자를 작성하여 재사용 할 수는 있습니다 (그러나 일시적 조정자가 포함 된 클래스/메소드의 이름을주의하십시오. 그렇지 않으면이 문제점이 모든 정적 도우미 클래스/도구에 내재되어 있기 때문에 다시 찾을 때 어려움을 겪을 수 있습니다) . 사이드 노트 : 내 시간 라이브러리 Time4J는 이미이 기능을 상자에서 지원합니다 (컴파일 타임 typesafety 포함). [요지보기] (https://gist.github.com/MenoData/4384d9a6d2209a6c5ac8ca4f0cc69bb7) –

답변

3

TemporalAdjuster는 코드로 읽을 수있는이 기록 될 수 있습니다 예를 들어 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"); 
     } 
    }; 
} 
관련 문제