date_default_timezone_set('Europe/Moscow');
$simpleDate = date('Y-m-d');
$nameDay = date('l', strtotime($simpleDate));
$timeMoscow = intval(date('H'));
if($nameDay == 'Saturday' || $nameDay == 'Sunday') {
if($timeMoscow == 6 && $timeMoscow == 7 || $timeMoscow == 8 || $timeMoscow == 9){
$classMain = 'not-worked';
}
}
<?php
header('Content-type: text/plain');
?>31 Декабря с 8:00 до 17:00
1 Января выходной день
Со 2 января по 8 Января 10:00 до 23:00
9 Января с 11:00 до 23:00
<?
$dtList = [
['12/31', '12/31', false, [['08:00', '17:00', true]]], // открыто
['01/01', '01/02', false, []], // закрыто (пустой диапазон времени)
['01/02', '01/08', false, [['10:00', '23:00', true]]],
['01/09', '01/09', false, [['11:00', '23:00', true]]],
['01/01', '12/31', true, [['06:00', '08:00', false]]],
];
$dt = new dt('2020-12-28');
$finish = (new dt('2021-01-14'))->getTimestamp();
do {
$res = false;
foreach ($dtList as [$a1, $b1, $def, $subList]) {
$a1 = $dt->_clone($a1);
$b1 = $dt->_clone($b1);
if (h::testTimeRange($dt, $a1, $b1)) {
foreach($subList as [$a2, $b2, $c2]){
$a2 = $dt->_clone($a2);
$b2 = $dt->_clone($b2);
if (h::testTimeRange($dt, $a2, $b2)) {
$res = $c2;
break 2; // выход с обоих циклов
}
}
$res = $def; // первый уровень сработал, а второй не имеет подх. диапазона, значит значение по умолчанию для перв. уровня
break;
}
}
echo "\n ", $dt->format(), $res ? ' open' : ' close';
$dt->modify('+'.rand(1, 1).' hour');
} while ($dt->getTimestamp() < $finish);
<?php
class dt extends DateTime{
/** Формат отображения даты-времени по умолчанию в игре */
const F_DEFAULT = 'd.m.Y H:i';
/**
* Создает
*
* @param mixed $time
* @param DateTimeZone $timezone
*/
public static function createRand($time = null, DateTimeZone $timezone = null){
$time = preg_replace_callback('@/(\d+)-(\d+)/@', function($m){
return (string)h::rand($m[1], $m[2]);
}, $time);
return new self($time, $timezone);
}
/**
* $time допускает указание нескольких доп. параметров для modify() через разделитель |
*
* @param mixed $time
* @param DateTimeZone $timezone
* @return DateTime
*/
public function __construct($time = null, DateTimeZone $timezone = null){
$time = explode('|', $time);
parent::__construct($time[0], $timezone);
while($s = next($time)){
$this->modify($s);
}
}
/**
* Вывод даты согласно формату
*
* @param string Мо умолчнию будет общепринятый в игре вариант F_DEFAULT
* @return string
*/
public function format($format = null){
return parent::format(is_null($format) ? self::F_DEFAULT : $format);
}
/**
* Клонирует текущий объект.
* @return dt
*/
public function _clone($modify = null){
$res = clone $this;
if(!is_null($modify)){
$res->modify($modify);
}
return $res;
}
public function __toString(){
return $this->format();
}
}
$schedule = [
'weekdays' => [
1 => [[0, 24]],
2 => [[0, 24]],
...
7 => [[0, 6], [8, 24]]
],
'dates' => [
'2020-12-31' => [[0, 6], [8, 17]],
'2021-01-01' => [[0, 0]],
'2020-01-02' => [[10, 23]],
...
]
];
function isWorkTime($schedule) {
$date = date('Y-m-d');
$weekday = intval(date('N'));
$hour = intval(date('H'));
$daySchedule = $schedule['weekdays'][$weekday];
if (array_key_exists($date, $schedule['dates']]) {
$daySchedule = $schedule['dates'][$date];
}
foreach ($daySchedule as $workTime) {
if ($hour >= $workTime[0] && $hour < $workTime[1]) {
return true;
}
}
return false;
}