Как рассчитать дату и время окончания работы?

Я знаю количество затраченного времени на работу, могу вывести дату и время окончания работы, но без учета рабочего времени...и выходных дней. К примеру работа будет совершаться 5 часов, часы работы с 8 до 16, работу начали в 14 часов, соответственно как мне рассчитать время чтобы показать что завершится она в 11 часов + 1 день

Пробовал через get Day и т.д. Одними проверочными if else не обойтись потому как нужно проверять как входные данные так и выходные Может кто знает как сделать часы в которых 8 часов в сутках?

t = new Date()
 firstday = true
 var rest = 5   //рест колво часов на выполнение задания
 
  while (rest > 0){
  if(t.getDay() == 0||6){  //проверяем на выходные
   t.setDate(t.getDate()+ 1)} //пропускаем если выходной
   else {
   if(firstday){
    starthour = t.getHours() //если начинаем с середины дня 
    firstday = false        
    }
    else
    starthour = 10     //начинаем с начала дня
   ti = (19 - starthour) 
   if (rest > ti){ 
     rest = rest - ti
      t.setDate(t.getDate()+ 1)
  }
  else 
   return (t.getDate(), starthour + rest) 
  };
  }

Ответы (1 шт):

Автор решения: MBo

С учётом праздников и переноса выходных надёжнее всего перебирать день за днём

 пока остаток часов > 0:
     if праздник, выходной: 
         проматываем день
     else (рабочий день): 
        if первый день:
              начало дня = старт работы
        else: 
              начало дня = утро
        t = (вечер - начало дня)
        if осталось больше t:
            отнимаем t часов, проматываем день
        else:
            возвращаем текуший день, начало дня + остаток часов

Попробую модифицировать то, что у Вас получилось:

t = new Date()
firstday = True
let rest = 5
while (rest > 0){
  if(t.getDay() == 0||6){  
    t.setDate(t.getDate()+ 1)
  }
  else {
    if(firstday){
        starthour = t.getHours()
        firstday = False
    }
    else
        starthour = 10
  ti = (19 - starthour) 
  if (rest > ti){ 
         rest = rest - ti
          t.setDate(t.getDate()+ 1)
  }
  else 
    return t.getDate(), starthour + rest 
}

Рабочий код на Python.

def calcworkend(rest, startday, starthour, morning, evening):
    day = startday
    while rest > 0:
        if (day + 1) % 7 < 2:
            day += 1
        else:
            workstart = starthour if day == startday else morning
            workstart = min(evening, max(workstart, morning))
            hoursleft = evening - workstart
            if rest > hoursleft:
                rest -= hoursleft
                day += 1
            else:
                return (day - startday, workstart + rest)

print(calcworkend(8, 1, 15, 10, 19)) 
(1, 14)    # 4 часа в понедельник, 4 во вторник
print(calcworkend(8, 1, 3, 10, 19))
(0, 18)    # рано озадачили, в понедельник управились
print(calcworkend(8, 1, 22, 10, 19))
(1, 18)    # поздно озадачили, во вторник все делали
print(calcworkend(8, 5, 15, 10, 19))
(3, 14)  # в пятницу начали, в понедельник закончили
print(calcworkend(8, 7, 15, 10, 19))
(1, 18)  # в воскресенье озадачили, в понедельник поработали
print(calcworkend(32, 4, 18, 10, 19))
(6, 14)  # в четверг начали большое дело, в среду закончили
→ Ссылка