Представьте свое рабочее время как Duration
.
Duration dueTime = Duration.ofMinutes(15);
Представьте свое расписание как EnumMap<DayOfWeek, DailySchedule>
, где DailySchedule
- это класс, который вы пишете для ежедневного времени открытия и закрытия. Внутри класса время представлено как LocalTime
объектов. Класс, вероятно, будет иметь методы для определения того, находится ли данное время дня до, в пределах или после интервала расписания.
Желательно представить ваше начальное время 18:00 05.05.2020 как ZonedDateTime
в соответствующий часовой пояс (LocalDateTime
тоже может работать, но на самом деле не подходит для этой цели).
Учитывая вашу начальную дату и время, вычеркните из него день недели. Посмотрите ежедневное расписание на карте. Если время выходит за рамки интервала расписания, сначала настройте его на начало интервала сегодня или завтра, в зависимости от ситуации.
Первый снимок в установленный срок и время - это скорректированные дата и время плюс в свое время. ZonedDateTime
имеет метод plus
, который принимает Duration
. Теперь, если срок оплаты наступает на следующий день или позже сегодняшнего времени закрытия, это неверно. В этом случае используйте Duration.between
, чтобы вычислить, сколько времени вы можете занять в день (10 минут в вашем примере). Вычтите это из положенного времени (Duration.minus()
). Теперь приступим к работе на следующий день. Проверку действительно следует проводить в al oop, чтобы учесть, что ежедневный график может быть короче положенного времени. Если расписание на субботу 09: 00–09: 05 и воскресенье 10: 00–10: 05, нам, возможно, придется переключаться с пятницы на понедельник, прежде чем мы найдем правильную дату и время.
Duration
, DayOfWeek
, LocalTime
и ZonedDateTime
все принадлежат java .time, современному Java API даты и времени. Ссылка на руководство внизу.
Удачного кодирования.
Позднее редактирование: код
Я мог бы сделать это следующим образом:
Map<DayOfWeek, DailySchedule> weeklySchedule = new EnumMap<>(DayOfWeek.class);
DailySchedule weekdaySchedule
= new DailySchedule(LocalTime.of(7, 30), LocalTime.of(17, 0));
for (DayOfWeek dow = DayOfWeek.MONDAY;
dow.getValue() <= DayOfWeek.FRIDAY.getValue(); dow = dow.plus(1)) {
weeklySchedule.put(dow, weekdaySchedule);
}
weeklySchedule.put(DayOfWeek.SATURDAY,
new DailySchedule(LocalTime.of(9, 0), LocalTime.of(14, 0)));
weeklySchedule.put(DayOfWeek.SUNDAY,
new DailySchedule(LocalTime.of(10, 0), LocalTime.of(13, 0)));
Duration dueTime = Duration.ofMinutes(15);
// Set initial day and time
DayOfWeek currentDay = DayOfWeek.MONDAY;
LocalTime currentTime = LocalTime.of(16, 50);
Duration remainingTimeToAdd = dueTime;
DailySchedule todaysSchedule = weeklySchedule.get(currentDay);
if (todaysSchedule.isBeforeOpen(currentTime)) {
currentTime = todaysSchedule.getOpen();
} else if (todaysSchedule.isOnOrAfterClose(currentTime)) {
currentDay = currentDay.plus(1);
todaysSchedule = weeklySchedule.get(currentDay);
currentTime = todaysSchedule.getOpen();
}
// We will break this loop explicitly when done
while (true) {
// Can time be added today?
LocalTime candidateDueTime = currentTime.plus(remainingTimeToAdd);
if (todaysSchedule.isWithinSchedule(candidateDueTime)) {
// yes, done
currentTime = candidateDueTime;
break;
} else {
// take remainder of today and continue tomorrow
remainingTimeToAdd = remainingTimeToAdd.minus(Duration.between(currentTime, todaysSchedule.getClose()));
currentDay = currentDay.plus(1);
todaysSchedule = weeklySchedule.get(currentDay);
currentTime = todaysSchedule.getOpen();
}
}
System.out.println("Due day and time: " + currentDay + " at " + currentTime);
Вывод из пример:
Дата и время сдачи: ВТОРНИК в 07: 35
Код не будет работать, если установленный срок достаточно длинный, чтобы длиться с момента закрытия в один день к открытию на следующий день. И отсутствуют всевозможные проверки и проверки, вы захотите их добавить.
Ссылка
Oracle учебник: Дата Время объясняет, как использовать java .time.