Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Подсчёт рабочего времени (https://javascript.ru/forum/misc/67148-podschjot-rabochego-vremeni.html)

fenix_63 31.01.2017 11:39

Подсчёт рабочего времени
 
Всем привет! Народ, подскажите где можно взять алгоритм расчёта рабочего времени для Google-script? Ну или на JS?

Нужно между двумя датами подсчитать количество рабочих часов.
Рабочий день с 9:00 до 18:00 Обед с 13:00 до 14:00 с учетом того что СБ и ВСКР - выходные. Помогите пожалуйста.

Есть функция, которая к дате добавляет несколько рабочих часов, и возвращает новую дату с временем, вот она:

function getDeadlineDate(date, work) {
  
  var datework  = 0;
  var hour      = date.getHours();
  var timehour  = hour;
  var week   = getWeekDay(date);
  
  for(;;) 
  {
    if (work >= 8) 
    { 
      work -= 8;
      datework += 1;
    }
    else
    {      
      break;
    }
  }
  
  if (week == 6)
  {
    timehour = 9;
    datework += 2;
  }
  else if (week == 7) 
  {
    datework += 1;
    timehour = 9;
  }
  
  if((hour > 18) || (hour < 9)) 
  {
    timehour = 9 + work
  }
  else
  {    
    timehour += work;
  }
  
  
  if (hour < 13 && timehour >= 14 || timehour == 13)
  {
    timehour += 1;
  }
  
  if (week < 6 && ((week + datework) >= 7 || (week + datework == 6) ))
  {
    datework += 2;  
  }
  
    if (timehour >= 18)
  {
    timehour = timehour - 18 + 9;
    datework += 1;
  }
  
  var datework  = new Date(date.valueOf() + timehour*60*60*1000 + datework*24*60*60*1000 - hour*60*60*1000);
  return datework;

}


А вот как написать функцию, чтоб именно она вычисляла разницу (в рабочих часах) между 2-мя датами - не знаю пока, уже голову сломал.

Например

Первая дата: 30.01.2017 16:43
Вторая дата: 31.01.2017 11:45

Просто если разницу в часах считать, то это 19 часов и 3 минуты разница, но именно рабочих часов в них 4 часа 02 минуты.
Функция должна вернуть: 4 часа 02 минуты, ну или 4,03 часа

Помогите пожалуйста, кто может.

ksa 31.01.2017 11:50

Цитата:

Сообщение от fenix_63
Помогите пожалуйста, кто может.

У нас есть чудесный раздел "Работа". ;)
Объяви сумму за решение проблемы, может и желающие найдутся...

Vlasenko Fedor 31.01.2017 12:18

Переведите все точки отсчета времени в секунды, сделайте вычисления и будет вам счастье

рони 31.01.2017 12:57

Poznakomlus,
:blink:

Vlasenko Fedor 31.01.2017 14:09

рони,
миллисекунды если об этом
var vanDate = '30.01.2017 16:43',
  twoDate = '31.01.2017 11:45';//

function dateStringToInt(str) {
  return Date.parse(
      str.replace(/^(\d+)\.(\d+)\.(\d+)\s(\d+):(\d+)$/, '$3-$2-$1T$4:$5:00.000Z')
    ) / 1000;
}

alert((dateStringToInt(twoDate) - dateStringToInt(vanDate)) / 3600 + ' часов прошло');

ksa 31.01.2017 14:16

Poznakomlus, там не разность дат нужна... :D
Нужно количество "рабочего времени". Если известно расписание... Перерыв на обед и выходные...

Vlasenko Fedor 31.01.2017 14:28

ksa,
все дошло, кол-во рабочих дней надо, при 8 ч рабочем дне

laimas 31.01.2017 15:39

Цитата:

Сообщение от ksa
Перерыв на обед и выходные...

Это еще и скромно. Смотря в контексте какого законодательства это, в России еще и праздничные дни попадающие на выходные переносятся. Переносы праздников, дней рабочих также возможны и постановлением правительства.

fenix_63 31.01.2017 16:35

Ну хотя бы если условиться что рабочие дни пн-пт с 9:00 до 18:00, обед с 13:00 до 14:00. Праздничные дни не учитываются, и переносы праздников тоже.

laimas 31.01.2017 18:32

Ну тогда по логике:

Узнаем какой день недели выпадает на первую дату диапазона, и сколько дней в диапазоне. Если дата рабочая, из нее берем разницу от рабочих часов. А также можно узнать остаток времени до конца дня. Если дней в диапазоне меньше двух, берем такую же разность у второй даты диапазона, если это следующий день и рабочий.

Если в диапазоне более дней, то плюсуем к полученному от первой даты 7 часов * на каждый полный рабочий день, что можно знать опираясь на день недели первой даты диапазона. А затем уже остаток от последней даты диапазона.


Часовой пояс GMT +3, время: 20:08.