2015-08-17 3 views
0

Я хотел бы указать набор часов работы на 7-дневную неделю. Когда посетитель посещает веб-страницу, я хотел бы отображать текущее время и день в определенной стране (Невис, Карибский бассейн), а затем сравнивать ее с определенным набором времени открытия, чтобы показать одно из двух подписи: 1) Открыть 2) Закрыто , В частности, это то, что я хочу, чтобы произвести:Сравнить текущее время со значениями в массиве true/false

enter image description here

Я использую это до сих пор, чтобы получить текущее время и создать массив, но как я могу сравнить два?

<?php 
    function get_timee($country,$city) { 
     $country = str_replace(' ', '', $country); 
     $city = str_replace(' ', '', $city); 
     $geocode_stats = file_get_contents("http://maps.googleapis.com/maps/api/geocode/json?address=$city+$country,&sensor=false"); 
     $output_deals = json_decode($geocode_stats); 
     $latLng = $output_deals->results[0]->geometry->location; 
     $lat = $latLng->lat; 
     $lng = $latLng->lng; 
     $google_time = file_get_contents("https://maps.googleapis.com/maps/api/timezone/json?location=$lat,$lng&timestamp=1331161200&key=xxx"); 
     $timez = json_decode($google_time); 
     $d = new DateTime("now", new DateTimeZone($timez->timeZoneId)); 
     return $d->format('H:i'); 
    } 

    $array = array(
     "Monday" => "10:00 - 18:00", 
     "Tuesday" => "10:00 - 18:00", 
     "Wednesday" => "10:00 - 18:00", 
     "Thursday" => "10:00 - 18:00", 
     "Friday" => "18:00 - 23:00", 
     "Saturday" => "18:00 - 23:00", 
     "Sunday" => "Closed" 
    ); 

    ?> 

<?php echo get_timee("Federation of Saint Kitts and Nevis","Nevis"); ?>. В настоящее время мы ...

+3

Вы не должны разделять ключ API публично. – treegarden

+1

Я удалил его, лучше поздно, чем Невис. Я имею в виду, никогда. – RiggsFolly

ответ

1

Вы можете сделать все это без использования Google ничего. Я предполагаю, что вы делали это, чтобы вы могли найти время в месте нахождения клиентов. Или, может быть, потому, что вы не были уверены, на какой временной шкале на вашем сервере был установлен, или вы знаете, что для вашего местоположения установлен неправильный часовой пояс.

Но вы можете сделать все это, используя основные классы PHP DateTime() и DateTimeZone().

Примечание: Я изменил массив времени открытия/закрытия, чтобы упростить обработку!

<?php 

    $opening_times = array(
     "Monday" => array('open' => '10:00', 'close' => '18:00'), 
     "Tuesday" => array('open' => '10:00', 'close' => '18:00'), 
     "Wednesday" => array('open' => '10:00', 'close' => '18:00'), 
     "Thursday" => array('open' => '10:00', 'close' => '18:00'), 
     "Friday" => array('open' => '18:00', 'close' => '23:00'), 
     "Saturday" => array('open' => '18:00', 'close' => '23:00'), 
     "Sunday" => "Closed" 
    ); 


function AreWeOpen($were_open, $date) 
{ 
    $htm = ''; 
    if (! is_array($were_open[$date->format('l')]) 
     && strtolower($were_open[$date->format('l')]) == 'closed') 
    { 
     $htm = 'We are closed all day Sunday'; 
    } else { 
     if ( $date->format('H:i') >= $were_open[$date->format('l')]['open'] 
      && $date->format('H:i') <= $were_open[$date->format('l')]['close'] 
      ) 
     { 
      $htm = 'We are open'; 
     } else { 
      $htm = 'We are closed'; 
     } 
    } 
    return $htm; 
} 

Теперь, чтобы запустить/протестировать, прежде всего, вы делаете:

// set date time to NOW 
    $date = new DateTime(null, new DateTimeZone('America/St_Kitts')); 
    echo 'Are we open now? Now is ' . $date->format('l H:i') . ' >'; 
    echo AreWeOpen($opening_times, $date); 

    echo PHP_EOL; 

    echo 'Are we open at 09:59 Monday > '; 
    $date = new DateTime('2015/08/17 09:59:00', new DateTimeZone('America/St_Kitts')); 
    echo AreWeOpen($opening_times, $date); 

    echo PHP_EOL; 

    echo 'Are we open at 10:00 Monday > '; 
    $date = new DateTime('2015/08/17 10:00:00', new DateTimeZone('America/St_Kitts')); 
    echo AreWeOpen($opening_times, $date); 

    echo PHP_EOL; 

    echo 'Are we open at 18:00 Monday > '; 
    $date = new DateTime('2015/08/18 18:00:00', new DateTimeZone('America/St_Kitts')); 
    echo AreWeOpen($opening_times, $date); 

    echo PHP_EOL; 

    echo 'Are we open at 18:01 Monday > '; 
    $date = new DateTime('2015/08/18 18:01:00', new DateTimeZone('America/St_Kitts')); 
    echo AreWeOpen($opening_times, $date); 

    echo PHP_EOL; 

    echo 'Are we open at 18:01 Friday > '; 
    $date = new DateTime('2015/08/21 18:01:00', new DateTimeZone('America/St_Kitts')); 
    echo AreWeOpen($opening_times, $date); 


    echo PHP_EOL; 

    echo 'Are we open on SUNDAY > '; 
    $date = new DateTime('2015/08/16 18:01:00', new DateTimeZone('America/St_Kitts')); 
    echo AreWeOpen($opening_times, $date); 

И это дает следующие результаты:

Are we open now? Now is Monday 07:38 >We are closed 
Are we open at 09:59 Monday > We are closed 
Are we open at 10:00 Monday > We are open 
Are we open at 18:00 Monday > We are open 
Are we open at 18:01 Monday > We are closed 
Are we open at 18:01 Friday > We are open 
Are we open on SUNDAY > We are closed all day Sunday 
+0

Это потрясающе. Спасибо за объяснение. Да, я использовал Google для получения Невиса, но вы решили все это отменить, что еще лучше. – egr103

1

набросков раствора:

  1. Вычислить числовую версию раз открытие массива. Этот массив будет отображать день недели в часы работы, индексируя дни в то же время DateTime-> Format ('w'), начиная с 0 для воскресенья и т. Д. Каждая запись может быть нулевой в течение нерабочего времени, или массив, содержащий количество секунд в день открытия магазина.

  2. Изменить get_timee, чтобы вернуть объект DateTime самостоятельно.

  3. Определите, находится ли рассчитанный объект DateTime в пределах диапазона для текущей даты. В частности, используйте (int) $ dateTime-> format ('w'), чтобы получить индекс, а затем посмотрите, что в вашем числовом массиве. Если запись не является нулевой, выполните вычисление «секунд» для элемента dateTime и определите, попадает ли он в диапазон.

Смежные вопросы