Сообщение ОТКРЫТО / ЗАКРЫТО в PHP на основе часов работы магазина - PullRequest
2 голосов
/ 17 марта 2020

У меня есть компания, которая выполняет доставку в определенные часы и у меня есть код, который, кажется, работает до сих пор.

Цель состоит в том, чтобы отобразить сообщение, основанное на времени и статусе доставки. Единственное, что я хотел бы добавить, это сообщение за 30 минут до закрытия, которое гласит: «Завершение текущих заказов. Мы открываем завтра в (время открытия)».

Как я могу добавить это чисто?

//--------------------------------------------------
// ADD OPEN OR CLOSED MESSAGE BASED ON TIME

function open_closed_message() {

     date_default_timezone_set('America/Toronto');
     $date = new DateTime;
     echo date("D m/d/y  h:i:s",time())

    $times = array(
        'mon' => '9:00 AM - 9:00 PM',
        'tue' => '9:00 AM - 9:00 PM',
        'wed' => '9:00 AM - 9:00 PM',
        'thu' => '9:00 AM - 9:00 PM',
        'fri' => '9:00 AM - 9:00 PM',
        'sat' => '11:00 AM - 6:00 PM',
        'sun' => 'closed'
    );

    function compileHours($times, $timestamp) {
        $times = $times[strtolower(date('D',$timestamp))];
        if(!strpos($times, '-')) return array();
        $hours = explode(",", $times);
        $hours = array_map('explode', array_pad(array(),count($hours),'-'), $hours);
        $hours = array_map('array_map', array_pad(array(),count($hours),'strtotime'),         $hours, array_pad(array(),count($hours),array_pad(array(),2,$timestamp)));
        end($hours);
        if ($hours[key($hours)][0] > $hours[key($hours)][1]) $hours[key($hours)][1] =         strtotime('+1 day', $hours[key($hours)][1]);
        return $hours;
    }

    function isOpen($now, $times) {
        $open = 0; // time until closing in seconds or 0 if closed
        // merge opening hours of today and the day before
        $hours = array_merge(compileHours($times,         strtotime('yesterday',$now)),compileHours($times, $now)); 

        foreach ($hours as $h) {
            if ($now >= $h[0] and $now < $h[1]) {
                $open = $h[1] - $now;
                return $open;
            } 
        }
        return $open;
    }

    $now = time();
    $open = isOpen($now, $times);

    if ($open == 0) {
        echo "Closed - Sorry, we are not making deliveries.";
    } else {
        echo "Open - Yes, we are making deliveries.";
    }
}

1 Ответ

2 голосов
/ 17 марта 2020

Если isOpen возвращает количество секунд до закрытия, тогда вы можете просто добавить предложение elseif к вашему if, которое отображает сообщение о состоянии; используя время открытия следующего дня открытия

if ($open == 0) {
    echo "Closed - Sorry, we are not making deliveries.";
} 
elseif ($open <= 1800) {
    $tomorrow = strtotime('tomorrow', $now);
    if (date('N', $tomorrow) == 7) {
        $tomorrow = strtotime('next monday', $now);
    }
    $day = strtolower(date('D', $tomorrow));
    $tomorrow = date('l', $tomorrow);
    $opentime = preg_replace('/^(\d+:\d+ [AP]M).*/', '$1', $times[$day]);
    echo "Finishing up current orders. We re-open $tomorrow at $opentime";
}
else {
    echo "Open - Yes, we are making deliveries.";
}

Демонстрация на 3v4l.org

Примечание: я использовал $now в звонках на strtotime но это не обязательно, когда $now = time(). Я вставил его для проверки, например, установив $now = strtotime('2020-03-20 20:45:00');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...