• 1000 рабочее время, например, с 8: 00-16: 00 (workDayStartStop). А код, который задает дату начала и приращение в днях, должен распечатать дату окончания. Увеличение рабочих дней может составлять, например, 1,5f (что означает 8 + 4 часа рабочего дня) или 1,25f (8 + 2 рабочих часа).
## Проблемы:
Мой код еще не проверяет праздничные и выходные дни
Мой код правильно печатает только дни и часы (на будущее), но он также должен рассчитывать минуты.
Мой код тоже должен рассчитывать в обратном направлении, если в днях указаны отрицательные значения для увеличения.
public void setWorkdayStartAndStop(Calendar start, Calendar stop) {
ZonedDateTime startZdt = ((GregorianCalendar) start).toZonedDateTime();
ZonedDateTime endZdt = ((GregorianCalendar) stop).toZonedDateTime();
long wholeDays = ChronoUnit.DAYS.between(startZdt, endZdt);
startZdt = startZdt.plusDays(wholeDays);
Duration workDay = Duration.between(startZdt, endZdt);
this.workdayStartAndStop = (float) workDay.toMinutes() / (float) Duration.ofHours(1).toMinutes();
}
public LocalDateTime getWorkdayIncrement(LocalDateTime startDate, float incrementInWorkdays) {
Holidays holidays = new Holidays();
CalendarController cc = new CalendarController();
holidays.setHolidayIfIsSetToRecurring();
int days = (int) Math.abs(incrementInWorkdays);
float remaining = incrementInWorkdays - days;
float fHours = remaining * 24f;
int hours = (int) fHours;
remaining = fHours - hours;
float fMinutes = remaining * 60f;
int minutes = (int) fMinutes;
LocalDateTime mDateTime = null;
for (int i = 0; i <= days; i++) {
mDateTime = startDate.plusDays(i).plusHours(hours).plusMinutes(minutes);
LocalDate toLocalDate = mDateTime.toLocalDate();
//if the incremented day is a holiday, skip to nextday
if (cc.isHoliday(toLocalDate)) {
days += 1;
}
}
return mDateTime;
}
}
public static void main(String[] args) {
WorkdayCalendar workdayCalendar = new WorkdayCalendar();
workdayCalendar.setWorkdayStartAndStop(
LocalDateTime.of(2020, 1, 1, 8, 0),
LocalDateTime.of(2020, 1, 1, 16, 0));
workdayCalendar.setRecurringHoliday(
MonthDay.of(5, 17));
workdayCalendar.setHoliday(LocalDate.of(2020, 5, 27));
LocalDateTime start = LocalDateTime.of(2020, 5, 24, 8, 5);
String datePattern = "dd-MM-yyyy HH:mm";
DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern(datePattern);
float increment = 1.5f;
System.out.println(
europeanDateFormatter.format(start) +
" with the addition of " +
increment +
" working days is " +
europeanDateFormatter.format(workdayCalendar.getWorkdayIncrement(start, increment)));
}
Вывод:
24-05-2020 08:05 с добавлением 1,5 рабочих дней 26-05-2020 20: 05
начиная с 24-го в 8 часов утра он должен заканчиваться 25-го в 12 часов утра (8ч + 4ч). 1 рабочий день только с 8 до 16, затем он должен перейти на следующий день. он должен давать результаты только между 8 и 16, если startDate установлен на 08:00, а wokringhours установлен на 8 часов в день.