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

Здравствуйте. Ни у кого не завалялся класс/функция по подсчёту количества ночных часов между datetimes? Интервал с 22:00 до 6:00

PHP:
  1. $dates = [
  2.     [
  3.         ‘2023-09-01 07:32:04’,
  4.         ‘2023-09-01 22:15:08’
  5.     ],
  6.     [
  7.         ‘2023-09-03 07:40:44’,
  8.         ‘2023-09-03 20:14:59’
  9.     ],
  10.     [
  11.         ‘2023-09-04 21:11:13’,
  12.         ‘2023-09-05 05:31:49’
  13.     ],
  14.     [
  15.         ‘2023-09-16 07:38:34’,
  16.         ‘2023-09-16 23:10:31’
  17.     ],
  18.     [
  19.         ‘2023-09-19 15:00:00’,
  20.         ‘2023-09-20 02:00:00’
  21.     ],
  22.     [
  23.         ‘2023-09-22 22:00:00’,
  24.         ‘2023-09-23 06:00:00’
  25.     ]
  26. ];

Спасибо.

 

Сами, то пробовали решить?

 

Добрый день!
Попробуйте это:

PHP:
  1. <?php
  2. $dates = [
  3.     [
  4.         ‘2023-09-01 07:32:04’,
  5.         ‘2023-09-01 22:15:08’
  6.     ],
  7.     [
  8.         ‘2023-09-03 07:40:44’,
  9.         ‘2023-09-03 20:14:59’
  10.     ],
  11.     [
  12.         ‘2023-09-04 21:11:13’,
  13.         ‘2023-09-05 05:31:49’
  14.     ],
  15.     [
  16.         ‘2023-09-16 07:38:34’,
  17.         ‘2023-09-16 23:10:31’
  18.     ],
  19.     [
  20.         ‘2023-09-19 15:00:00’,
  21.         ‘2023-09-20 02:00:00’
  22.     ],
  23.     [
  24.         ‘2023-09-22 22:00:00’,
  25.         ‘2023-09-23 06:00:00’
  26.     ]
  27.     ,
  28.     [
  29.         ‘2023-09-22 22:00:00’,
  30.         ‘2023-09-23 08:00:00’
  31.     ]
  32.  
  33.  
  34. ];
  35.  
  36. class nightTimeFromDates{
  37.  
  38.     private $nightTimeBegin;
  39.     private $nightTimeEnd;
  40.  
  41.     function __construct($nightTimeBegin=«22:00:00», $nightTimeEnd=«06:00:00») {
  42.         $this -> nightTimeBegin = $nightTimeBegin;
  43.         $this -> nightTimeEnd = $nightTimeEnd;
  44.     }
  45.  
  46.     private function getCheckDate($FromDate, $nightTime){
  47.         return new DateTime(substr($FromDate,0,11).$nightTime);
  48.     }
  49.  
  50.     private function CheckNexDay($date){
  51.         $dateBegin = new DateTime(substr($date[0],0,11));
  52.         $dateEnd = new DateTime(substr($date[1],0,11));
  53.         return  $dateEnd -> diff($dateBegin)->d;
  54.     }
  55.  
  56.     public function getNightTime($date){
  57.         $dateBegin = new DateTime($date[0]);
  58.         $dateEnd = new DateTime($date[1]);
  59.         $timeBegin = $dateBegin -> getTimestamp();
  60.         $timeEnd = $dateEnd -> getTimestamp();
  61.         $nightTimeBegin = $this -> nightTimeBegin;
  62.         $nightTimeEnd = $this -> nightTimeEnd;
  63.         $checkDateBegin = $this -> getCheckDate($date[0], $nightTimeBegin);
  64.         $checkTimeBegin = $checkDateBegin -> getTimestamp();
  65.         $checkDateEnd = $this -> getCheckDate($date[1], $nightTimeEnd);
  66.         $checkTimeEnd = $checkDateEnd -> getTimestamp();
  67.         if($timeEnd >= $checkTimeBegin)
  68.         {
  69.             if($timeEnd > $checkTimeEnd AND $this->CheckNexDay($date))
  70.                 $dateEnd = $checkDateEnd;
  71.  
  72.             $nightTime = $checkDateBegin -> diff($dateEnd);
  73.  
  74.  
  75.             return [
  76.                 $nightTime->h,
  77.                 $nightTime->i,
  78.                 $nightTime->s
  79.             ];
  80.         }
  81.         else
  82.             return false;
  83.     }
  84.  
  85. }
  86.  
  87.  
  88.  
  89. $nightTimeBegin = «22:00:00»;
  90. $nightTimeEnd = «06:00:00»;
  91. $nightNightTime = new nightTimeFromDates($nightTimeBegin, $nightTimeEnd);
  92. /*
  93. OR
  94. $nightNightTime = new nightTimeFromDates();
  95. default:
  96. $nightTimeBegin = «22:00:00»;
  97. $nightTimeEnd = «06:00:00»;
  98. */
  99.  
  100. foreach($dates as $date)
  101. {
  102.     echo «<hr>»,$date[0],» «,$date[1], «<br>»;
  103.     $nightTime = $nightNightTime -> getNightTime($date);
  104.     if($nightTime)
  105.     {
  106.         echo $nightTime[0].‘ hours<br>’;
  107.         echo $nightTime[1].‘ minutes<br>’;
  108.         echo $nightTime[2].‘ seconds’;
  109.     }
  110.     else
  111.         echo «Not night time<br>»;
  112. }
  113.  
  114. /*
  115. test:
  116.  
  117. 2023-09-01 07:32:04 2023-09-01 22:15:08
  118. 0 hours
  119. 15 minutes
  120. 8 seconds
  121.  
  122. 2023-09-03 07:40:44 2023-09-03 20:14:59
  123. Not night time
  124.  
  125. 2023-09-04 21:11:13 2023-09-05 05:31:49
  126. 7 hours
  127. 31 minutes
  128. 49 seconds
  129.  
  130. 2023-09-16 07:38:34 2023-09-16 23:10:31
  131. 1 hours
  132. 10 minutes
  133. 31 seconds
  134.  
  135. 2023-09-19 15:00:00 2023-09-20 02:00:00
  136. 4 hours
  137. 0 minutes
  138. 0 seconds
  139.  
  140. 2023-09-22 22:00:00 2023-09-23 06:00:00
  141. 8 hours
  142. 0 minutes
  143. 0 seconds
  144.  
  145. 2023-09-22 22:00:00 2023-09-23 08:00:00
  146. 8 hours
  147. 0 minutes
  148. 0 seconds
  149. */
  150. ?>

Удачи!

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *