Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для HotReboot
326 / 227 / 92
Регистрация: 22.04.2017
Сообщений: 1,136

Подсчёт ночных часов

27.09.2023, 17:28. Показов 700. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Ни у кого не завалялся класс/функция по подсчёту количества ночных часов между datetimes?
PHP
1
2
$time_min = '2023-09-26 20:00:00';
$time_max = '2023-09-27 08:00:00';
Вычислить количество часов с 22:00 до 6:00.
Время может и быть
PHP
1
2
$time_min = '2023-09-26 23:00:00';
$time_max = '2023-09-27 03:00:00';
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.09.2023, 17:28
Ответы с готовыми решениями:

Расчет ночных часов за смену
День добрый всем, возник вопрос такой, как можно отобразить расчет ночных часов? Если пользователь нажал на галочку (Chheckbox1.Checked),...

Для табеля рабочего времени посчитать количество ночных часов
Есть табель рабочего рабочего времени, имеются ночные часы, формата 12/8, 12-это рабочий день, а 8 из них ночных, какой формулой можно...

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

12
 Аватар для CyberTemir
70 / 49 / 23
Регистрация: 21.05.2023
Сообщений: 160
27.09.2023, 17:51
PHP
1
2
3
4
$time_min = '2023-09-26 22:00:00';
$time_max = '2023-09-27 06:00:00';
$hours = round((strtotime($time_max) - strtotime($time_min))/3600, 1);
echo $hours; // 8
0
 Аватар для HotReboot
326 / 227 / 92
Регистрация: 22.04.2017
Сообщений: 1,136
27.09.2023, 17:57  [ТС]
CyberTemir, Вы не поняли. Такой вопрос бы я задал в "PHP для начинающих". Мне нужно подсчитать количество ночных часов (с 22:00 до 06:00) в промежутки времени с 2023-09-26 20:00:00 до 2023-09-27 08:00:00. Оно понятно если эти 22 по - 06 входят в диапазон. Но я привел и другой пример - с 2023-09-26 23:00:00 до 2023-09-27 03:00:00.
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
27.09.2023, 18:05
Цитата Сообщение от HotReboot Посмотреть сообщение
Но я привел и другой пример - с 2023-09-26 23:00:00 до 2023-09-27 03:00:00.
PHP
1
2
3
4
5
6
<?php
 
$time_min = '2023-09-26 23:00:00';
$time_max = '2023-09-27 03:00:00';
$hours = round((strtotime($time_max) - strtotime($time_min))/3600, 1);
echo $hours; // 4
it works again
0
 Аватар для HotReboot
326 / 227 / 92
Регистрация: 22.04.2017
Сообщений: 1,136
27.09.2023, 18:16  [ТС]
О хосподи.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$list_time = [
    [
        '2023-09-26 20:00:00',
        '2023-09-27 08:00:00'
    ],
    [
        '2023-09-27 23:00:00',
        '2023-09-28 03:00:00'
    ],
    [
        '2023-09-28 21:00:00',
        '2023-09-29 09:00:00'
    ]
];
foreach($list_time as $time){
   $time[0] = ...;
   $time[1] = ...;
   ....
}
Может так понятнее будет...
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
27.09.2023, 18:45
Тип того
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
 
function hourDiff(string $startDate, string $endDate): int
{
    return round((strtotime($endDate) - strtotime($startDate)) / 3600, 1);
}
 
$listTime = [
    [
        '2023-09-26 19:00:00',
        '2023-09-27 08:00:00',
    ],
    [
        '2023-09-26 20:00:00',
        '2023-09-27 08:00:00',
    ],
    [
        '2023-09-27 23:00:00',
        '2023-09-28 03:00:00',
    ],
    [
        '2023-09-29 21:00:00',
        '2023-09-30 09:00:00',
    ],
];
 
foreach ($listTime as [$startDate, $endDate]) {
    $beginOffset  = 0;
    $expectedDate = (new \DateTime($startDate))->format("Y-m-d 20:00:00");
    if ($expectedDate > $startDate) {
        $beginOffset = hourDiff($startDate, $expectedDate);
    }
 
    $endOffset    = 0;
    $expectedDate = (new \DateTime($endDate))->format("Y-m-d 06:00:00");
    if ($expectedDate < $endDate) {
        $endOffset = hourDiff($expectedDate, $endDate);
    }
 
    echo hourDiff($startDate, $endDate) - $beginOffset - $endOffset, PHP_EOL;
}
10
10
4
9
1
 Аватар для HotReboot
326 / 227 / 92
Регистрация: 22.04.2017
Сообщений: 1,136
27.09.2023, 18:50  [ТС]
crautcher, Спасибо, но не учитываются минуты. Без них у меня и так есть алгоритм.
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
27.09.2023, 18:56
Цитата Сообщение от crautcher Посмотреть сообщение
PHP
1
/ 3600
Этот делитель замени на 60 и будет в минутах
0
 Аватар для HotReboot
326 / 227 / 92
Регистрация: 22.04.2017
Сообщений: 1,136
27.09.2023, 20:31  [ТС]
crautcher, Всё равно что-то не то. Какие-то минусы выскакивают. Видимо когда даты одинаковые. Массив большой и пока не могу сказать из-за чего.

Даты могут быть только сегодня.
'2023-09-27 07:00:00',
'2023-09-27 17:00:00',

Так же вот такое может быть.
'2023-09-27 08:10:00',
'2023-09-27 22:45:00',
0
 Аватар для Дух системы
75 / 58 / 20
Регистрация: 01.10.2009
Сообщений: 208
29.09.2023, 15:07
ну такое себе, но работает

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$br="\r\n";
//$br='<br>';
$pers=[
0=>['from'=>'2023-09-26 23:00:00','to'=>'2023-09-27 03:00:00'],
1=>['from'=>'023-09-27 08:10:00','to'=>'2023-09-27 22:45:00'],
2=>['from'=>'2023-09-27 07:00:00','to'=>'2023-09-27 17:00:00']
];
foreach($pers AS $k => $r)
{
    $r['from']=strtotime($r['from']);
    $r['to']=strtotime($r['to']);
 
    if($r['to'] < $r['from'])
    {
        $tmp=$r['from'];
        $r['from']=$r['to'];
        $r['to']=$tmp;
        unset($tmp);
    }
 
    $sec=0;
    echo 'itrs:'.round($r['to']-$r['from']).$br;
    for($i=$r['from'];$i<=$r['to'];$i++)
    {
        //echo '.';
        $h=date('H',$i);
        if($h > 21)
        {
            $sec++;
        }
        else
        {
            if($h < 6)
            {
                $sec++;
            }
        }
    }
    echo date('d.m.Y H:i:s',$r['from']).' > '.date('d.m.Y H:i:s',$r['to']).$br;
    echo 'sec:'.$sec.' min:'.round($sec/60).' hrs:'.round($sec/60/60).$br.$br;
}
itrs:14400
26.09.2023 23:00:00 > 27.09.2023 03:00:00
sec:14401 min:240 hrs:4

itrs:52500
27.09.2023 08:10:00 > 27.09.2023 22:45:00
sec:2701 min:45 hrs:1

itrs:36000
27.09.2023 07:00:00 > 27.09.2023 17:00:00
sec:0 min:0 hrs:0
1
 Аватар для HotReboot
326 / 227 / 92
Регистрация: 22.04.2017
Сообщений: 1,136
30.09.2023, 07:54  [ТС]
Дух системы, Спасибо, но, к сожалению, это не точно. Например
PHP
1
2
3
$pers = [
    ['from' => '2023-09-27 15:00:00', 'to' => '2023-09-28 02:00:00']
];
выдаёт 14401 секунды. Мне нужно подсчитать за 2 года разом с множеством похожих интервалов. Выльется в большое расхождение.
1
 Аватар для Дух системы
75 / 58 / 20
Регистрация: 01.10.2009
Сообщений: 208
01.10.2023, 13:50
14401 сек это 4,000277777777778 часа, что соответствует задаче с 22:00 до 2:00

если проблема в ускорить, то мб вариант поделить на 60 секунд и подставлять уже $h=date('H',$i.'01');, тк по сути нужны только минуты, для того чтобы уменьшить кол-во итераций

проблем со сборкой массива за два года думаю у вас не будет
0
 Аватар для Дух системы
75 / 58 / 20
Регистрация: 01.10.2009
Сообщений: 208
20.10.2023, 13:42
Цитата Сообщение от HotReboot Посмотреть сообщение
выдаёт 14401 секунды
кстати это не ошибка, там действительно 14401 секунд, поскольку окончание идет на 2023-09-28 02:00:00, а не на 2023-09-28 01:59:59
как вариант задать точку отсчета $sec=-1;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2023, 13:42
Помогаю со студенческими работами здесь

Дан список дневных и ночных температур; определить день с максимальной разницей дневных и ночных температур
1. Дан список дневных и ночных температур за неделю. Определить день, с максимальной разницей дневных и ночных температур. 2. Дан список...

Подсчет кол-ва часов...
Добрый день! Помогите решить пожалуйста. Рубежка идет. Очень прошу решите... Задача. Подсчет количества часов, минут и секунд в данном...

Подсчет рабочих часов
Здравствуйте! Уже долго не могу написать правильную формулу для составления нормального графика. Суть в том, что нужно посчитать...

Подсчет часов DataTimePicker'a
Вообщем есть два DataTimePicke'a, в которых я ввожу начало рейса и окончание и нужно чтобы в texbox писало количество часов этого интервала...

Подсчёт часов, в графике
Доброго времени суток! Столкнулся с проблемой, подскажите пожалуйста как лучше сделать.... В таблице нужно подсчитать общее количество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru