Здравствуйте Гость [ Вход | Регистрация ] | Форум в сети 5340-й день

Тут може бути Ваша реклама

 Разница между 2мя датами в часах без учета выходных и праздников

RipperR
Jul 24 2017, 22:30
  
Пост #1



Репутация:   40  
Постоялец
***

Группа: Пользователи
Сообщений: 1 150
С нами с: 25-March 08


Кто-то реализовывал на php данную задачу: "Разница между 2мя датами в часах без учета выходных и праздников"

Есть таблица государственных праздников в идеале ее парсить откуда-то, но пока введена вручную.

Имеем дата время начала задачи и имеем дату время конца задачи надо вычислить кол-во часов с момента начала задачи исключая отсюда нерабочие дни к примеру праздники и выходные ... а также учитывать рабочий день с 9-00 до 20-00 ... то-есть надо учитывать сколько рабочего времени потратил человек на выполнение задачи.

Пока не сильно вкуриваю как это сделать ...

Сообщение отредактировал RipperR - Jul 24 2017, 22:31
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов(1 - 6)
Durex
Jul 24 2017, 23:24
  
Пост #2



Репутация:   57  
Активист
*

Группа: Пользователи
Сообщений: 265
С нами с: 14-June 06



<?php
    date_default_timezone_set('UTC+2');
    $date = '2009-12-06';
    $end_date = '2020-12-31';
    $workdays = array();
    $a = 1;
    while (strtotime($date) <= strtotime($end_date)) {
                $workdays[$a] = $date;
                $date = date ("Y-m-d", strtotime("+1 day", strtotime($date)));
                $a++;
    }
echo count($workdays).'<br>';

while(($key = array_search('2019-05-13',$workdays)) !== false) {
    unset($workdays[$key]);
}
echo count($workdays).'<br>';

$total = count($workdays)*12;
echo "<p>Worked $total hours</p>";

//print_r($workdays);
?>


Что-то типа такого. Выходные из таблицы в массив и перебором убрать из массива дней

Сообщение отредактировал Durex - Jul 25 2017, 8:25
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
revolver
Jul 24 2017, 23:34
  
Пост #3



Репутация:   1449  
ultra active user
******

Группа: Пользователи
Сообщений: 31 884
С нами с: 2-June 08


масенький офтоп
буквально на днях похожий вопрос разирался в известном блоге (по бд)

How to Count Week Days Between Two Dates?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
RipperR
Jul 25 2017, 11:36
  
Пост #4



Репутация:   40  
Постоялец
***

Группа: Пользователи
Сообщений: 1 150
С нами с: 25-March 08


Сяду сегодня повкуриваю ... просто адовый мопед нехотелось бы делать ...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
RipperR
Jul 26 2017, 11:20
  
Пост #5



Репутация:   40  
Постоялец
***

Группа: Пользователи
Сообщений: 1 150
С нами с: 25-March 08


(Durex @ Jul 25 2017, 0:24) Перейти к цитате


<?php
    date_default_timezone_set('UTC+2');
    $date = '2009-12-06';
    $end_date = '2020-12-31';
    $workdays = array();
    $a = 1;
    while (strtotime($date) <= strtotime($end_date)) {
                $workdays[$a] = $date;
                $date = date ("Y-m-d", strtotime("+1 day", strtotime($date)));
                $a++;
    }
echo count($workdays).'<br>';

while(($key = array_search('2019-05-13',$workdays)) !== false) {
    unset($workdays[$key]);
}
echo count($workdays).'<br>';

$total = count($workdays)*12;
echo "<p>Worked $total hours</p>";

//print_r($workdays);
?>


Что-то типа такого. Выходные из таблицы в массив и перебором убрать из массива дней


да но тут в тупую берется count($workdays)*12;
А у меня задача началась в 19:00 первого дня закончилась к примеру 12:00 5 дня ... то-есть походу надо тупо лепить свой цикл и обходить тупо им календарь сверяя день недели рабочий ли день итп умножать на типовой рабочий день с коректировкой на первый и последний день ...

Сообщение отредактировал RipperR - Jul 26 2017, 11:20
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
vas1
Jul 26 2017, 11:33
  
Пост #6



Репутация:   7  
Дух


Группа: Пользователи
Сообщений: 40
С нами с: 9-February 14


Пользуйтесь карбоном
$dt = Carbon::create(2014, 1, 1);
$dt2 = Carbon::create(2014, 12, 31);
$daysForExtraCoding = $dt->diffInDaysFiltered(function(Carbon $date) {
   return $date->isWeekend();
}, $dt2);


И потом добавить сколько было часов от начала работы до конца первого дня + от начала последнего дня до конца работы.

Сообщение отредактировал vas1 - Jul 26 2017, 11:36
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
RipperR
Jul 26 2017, 23:08
  
Пост #7



Репутация:   40  
Постоялец
***

Группа: Пользователи
Сообщений: 1 150
С нами с: 25-March 08


Не стал разбираться с новой библиотекой ... мне кажется это забивание гвоздя микроскопом ... описал логику циклично вроде все получилось ... осталось там еще до усложнения которые я не описал вам но на это чувствую прийдеться поубивать время ...

Сделал на базе обхода  $date = date ("Y-m-d", strtotime("+1 day", strtotime($date))); и добавил проверки на дни недели и есть ли день в праздниках в заранее созданном словаре ... просчет времени сделал как 12 часовой раб день + хвост первого дня и хвост последнего ...

Сообщение отредактировал RipperR - Jul 26 2017, 23:10
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic

 



- Упрощённая версия
Сейчас: 28th October 2020 - 10:07
Сайт не предоставляет электронные версии произведений, а занимается лишь коллекционированием и каталогизацией ссылок, присылаемых и публикуемых на форуме нашими читателями. Если вы являетесь правообладателем какого-либо представленного материала и не желаете чтобы ссылка на него находилась в нашем каталоге, свяжитесь с нами и мы удалим её. Файлы для обмена предоставлены пользователями сайта.