#java #java-8 #java-time
#java #java-8 #java-время
Вопрос:
Я новичок в java8 time API, поэтому прошу прощения за плохую формулировку.
Что я хочу сделать, так это выяснить, когда в следующий раз (начиная с метки времени) выполняется определенный критерий, и когда он перестает выполняться.
Для примера предположим, что у меня есть миллисекундная временная метка, и я хочу выяснить, какова следующая временная метка, которая также является пятницей в данном часовом поясе.
Мне также нужно выяснить, когда он перестанет быть пятницей. Поскольку начало может быть, например, в 4:20 в пятницу днем (если это то время), поэтому start длина единицы недостаточно.
Obv много грязных способов сделать это, но я ищу элегантное решение в стиле java8. Реальная проблема, с которой я сталкиваюсь, немного сложнее, чем эта, но я думаю, что решение примера с пятницей дает мне достаточно подсказок для продвижения вперед.
Ответ №1:
Во-первых, вы, вероятно, захотите использовать ZonedDateTime
, поскольку Instant
это количество миллисекунд с момента начала эпохи и на самом деле не поддерживает такие понятия, как «дата» или «время» или «день недели».
На самом деле нет утилиты для «поиска критериев соответствия дате» — afaik, вам придется сделать это самостоятельно.
final Instant startVal = Instant.now();
final ZonedDateTime date = startVal.atZone(ZoneOffset.UTC); // or whatever
final int daysUntilFriday = (DayOfWeek.FRIDAY.getValue() - date.getDayOfWeek().getValue() 7) % 7; // 7 to avoid a negative value
final ZonedDateTime startOfNextFriday = date.plusDays(daysUntilFriday).truncatedTo(ChronoUnit.DAYS);
final ZonedDateTime endOfNextFriday = ZonedDateTime.of(startOfNextFriday.toLocalDate(), LocalTime.MAX, startOfNextFriday.getZone());
Комментарии:
1. Вместо вычисления добавляемых дней вы можете использовать
ZonedDateTime sameTimeOnNextFriday = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));