2016-11-07 2 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 уже поддерживает эту функцию из коробки (даже при использовании типов времени компиляции), см. Этот [пример gist] (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 «s, вот мой регулятор (для справки):

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"); 
     } 
    }; 
} 
Смежные вопросы