LINUX.ORG.RU

Как посчитать к какому промежутку времени относится отрезок?

 ,


0

1

Первым делом, советую взглянуть на картинку, в которой я попытался изобразить эти промежутки времени. Картинка

Кратенько опишу: есть текущий день (31), предыдущий и следующий. С 22:00 до 06:00 начинается «ночная» смена. Как посчитать, сколько времени («рабочего») попадет в «ночное» и «дневное» время?

Варианты работы: сутки; начинается в ночное, заканчивается в дневное; начинается в дневное, заканчивается в ночное; начинается и заканчивается в ночное; начинается и заканчивается в дневное.

Я ж сходу нагородил тысячу условий, вроде работало... Но потом полезли баги. Может подскажете, как это _нормально_ реализовать?

Deleted

Ответ на: комментарий от Razip

Я там уже половину снес на фиг, чтобы разобраться, где ошибка. Перепишу и кину.

Deleted
()

Смоделируй в общем виде, будет проще. У тебя N диапазонов в сутках, каждый имеет метку день/ночь/whatever, а также дата начала и конца t1,t2 в секундах с 1970. Выделяешь время начала внутри дня (floor(x/86400)), ищешь первый диапазон. Теперь идешь по концам диапазонов, пока не встретишь >= t2. По пути считаешь сколько часов скипнул и аккумулируешь в словаре по тегу диапазона.

anonymous
()
Ответ на: комментарий от Razip

Кажется я разобрался. Тестил минут 20, вроде все работает, какие только комбинации не перепробовал.

if ($time_start < $prev_night_end) {
	$end = strtotime($prev_night_end);
	$str = strtotime($time_start);
	$res = (($end - $str) / 60) / 60;
	$night_hours += $res;
}

if ($time_end > $night_start && $time_end < $night_end) {
	$str = strtotime($night_start);
	$end = strtotime($time_end);
	$res = (($end - $str) / 60) / 60;
	$night_hours += $res;
}

if (($time_start <= $night_start) && ($time_end >= $night_end)) {
	$night_hours += 8;
}
Если можно как то проще сделать, пишите.

УПД: код только для того случая, когда «рабочее время» не может длиться дольше 24 часов. Если такое может быть, то нужно делать нечто похожее на то, что предложил товарищ-анон выше.

Deleted
()
Последнее исправление: Bizun (всего исправлений: 2)
Ответ на: комментарий от Deleted

Во первых — это не ф-ция. Во вторых — мой посыл заключался в том, что ты походишь там по ссылкам, посмотришь примеры как диффать промежутки времени.

deep-purple ★★★★★
()
Ответ на: комментарий от cherry-pick

боюсь что с С будет абсолютно аналогично

kiotoze ★★★★
()
Ответ на: комментарий от deep-purple

КАКОГО ХРЕНА ПЫХ ПРОЛЕЗ В ДЕВЕЛОПМЕНТ!!!???

а чем он тебя так раздражает?
и здесь важна более логика нежели сама реализация на конкретном языке

kiotoze ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.