Несложная задачка для тестирования PHP программистов после курсов.
Условие «Необходимо настроить вывод формы оплаты таким образом, чтобы она работала с 8.30 до 16.30 в будние дни. В выходные и праздники форма работать не должна.»
Решение
//Платежный шлюз активен только 8-30 до 16-30 МСК
date_default_timezone_set("UTC");
$current_time['unixtime']=time()+3600*3;
$current_time['dayofweek'] = date ('w', $current_time['unixtime']);
$current_time['day'] = date ('j', $current_time['unixtime']);
$current_time['month'] = date ('n', $current_time['unixtime']);
$current_time['daytime'] = $current_time['unixtime'] % 86400;
$is_working_time=false;
//Проверка на рабочее и нерабочее время
//Выводим только если текущее время > 8-30 и < 16-30
if (($current_time['daytime']> 30600) && ($current_time['daytime'] < 59400 )) { $is_working_time=true; }
//Выходные
if (($current_time['dayofweek'] == 0) || ($current_time['dayofweek'] == 6 )) { $is_working_time=false; }
//Праздники
//с 29 апреля по 2 мая (4 дня);
if (($current_time['day'] == 29) && ($current_time['month'] == 4 )) { $is_working_time=false; }
if (($current_time['day'] == 30) && ($current_time['month'] == 4 )) { $is_working_time=false; }
if (($current_time['day'] == 1) && ($current_time['month'] == 5 )) { $is_working_time=false; }
if (($current_time['day'] == 2) && ($current_time['month'] == 5 )) { $is_working_time=false; }
//9 мая (1 день);
if (($current_time['day'] == 9) && ($current_time['month'] == 5 )) { $is_working_time=false; }
//с 10 по 12 июня (3 дня);
if (($current_time['day'] == 10) && ($current_time['month'] == 6 )) { $is_working_time=false; }
if (($current_time['day'] == 11) && ($current_time['month'] == 6 )) { $is_working_time=false; }
if (($current_time['day'] == 12) && ($current_time['month'] == 6 )) { $is_working_time=false; }
//с 3 по 5 ноября (3 дня).
if (($current_time['day'] == 3) && ($current_time['month'] == 11 )) { $is_working_time=false; }
if (($current_time['day'] == 4) && ($current_time['month'] == 11 )) { $is_working_time=false; }
if (($current_time['day'] == 5) && ($current_time['month'] == 11 )) { $is_working_time=false; }
if ($is_working_time) {
$payment_message = 'Вывод платежного шлюза';
} else {
$payment_message = '<i>Уважаемые Клиенты! Оплата заказа по банковской карте производится в рабочие дни с 08.30 до 16.30 по московскому времени. Пожалуйста, оплатите Ваш заказ в указанное время.</i>';
}
Может лучше из базы подтягивать список выходных дней и делать одной проверкой не входит ли текущая дата в него? Поскольку те же переносы выходного дня не будут корректно работать
Конечно лучше из базы или по API, но я не уверен что это годится в рамках тестового.