2016-03-31 7 views
-1

Ich versuche ein Buchungsformular zu erstellen, wo ein Benutzer eine Buchungszeit zwischen 2 vorgegebenen Zeiten in 5-Minuten-Intervallen auswählen kann. Zum Beispiel möchte ich Zeitfenster zwischen 10 Uhr und 12 Uhr, was mir ungefähr 20 Zeitfenster geben würde.php bekommen Zeitintervalle zwischen 2 mal

Wenn der Benutzer einen Steckplatz auswählt, sollte der früheste Steckplatz mindestens 15 Minuten vor der aktuellen Zeit liegen, aber der Benutzer kann einen Steckplatz und eine Stunde oder mehr auswählen, falls gewünscht.

Ich habe etwas Code auf SO gefunden (kann mich nicht erinnern, wo) und ich habe es für meine Bedürfnisse bearbeitet und es funktioniert, wenn die aktuelle Zeit innerhalb der Start- und Endzeit ist, aber wenn die aktuelle Zeit eine Stunde vor der ist früheste Zeit, erstellt es nicht die Zeitfenster.

Ich weiß, warum es es tut, aber ich weiß nicht, wie es zu beheben ist. Es hat mit dem while Zustand zu tun.

Ich möchte in der Lage sein, einen Steckplatz Stunden vor dem ersten verfügbaren Steckplatz zu buchen, wenn das möglich ist.

$timenow = time(); 

    $start_time = strtotime('+15 minutes', $timenow); 
    // round to next 15 minutes (15 * 60 seconds) 
    $start_time = ceil($start_time/(5 * 60)) * (5 * 60); 
    //set the start times 
    $opentime = strtotime('10:00'); 
    $closetime = strtotime('11:55'); 

    // get a list of prebooked slots from database 
    $time_slots = $this->countStartTimes(); 

    $available_slots = array(); 

    while($start_time <= $closetime && $start_time >= $opentime) { 

     $key = date('H:i', $start_time); 

     if(array_key_exists($key, $time_slots)) { 
      if($time_slots[$key] == SLOTS) { 
       $available_slots[] = 'FULL'; 
       break; 
      } 
     } 

     $available_slots[] = date('H:i', $start_time); 

     $start_time = strtotime('+5 minutes', $start_time); 
    } 

Antwort

1

Kohlenstoff besitzt alle Funktionen von der Basisklasse geerbt DateTime. Mit diesem Ansatz können Sie auf die Basisfunktionalität zugreifen, wenn in Carbon etwas fehlt, aber in DateTime.

// Carbon::diffInYears(Carbon $dt = null, $abs = true) 

    echo Carbon::now('America/Vancouver')->diffInSeconds(Carbon::now('Europe/London')); // 0 

    $dtOttawa = Carbon::createFromDate(2000, 1, 1, 'America/Toronto'); 
    $dtVancouver = Carbon::createFromDate(2000, 1, 1, 'America/Vancouver'); 
    echo $dtOttawa->diffInHours($dtVancouver);        // 3 

    echo $dtOttawa->diffInHours($dtVancouver, false);      // 3 
    echo $dtVancouver->diffInHours($dtOttawa, false); 

Gebrauch Kohlenstoff-Klasse für das es Ihnen wirklich

+0

Es wäre toll, wenn Sie einen Hinweis Link für 'Kohlenstoff liefern kann 'Bibliothek in Antwort ... –

+0

http://carbon.nesbot.com/docs/#api-difference Hier ist Link Verweis –

+0

Danke für Ihren Vorschlag – AdRock

0

helfen ich mit Datetime() erhalten gelang es funktioniert

$timenow = new DateTime(date('H:i')); 
$timenow->add(new DateInterval('PT15M')); 

$start = new DateTime('11:00'); 
$end = new DateTime('14:00'); 
$interval = new DateInterval('PT5M'); 

$time_slots = $this->countStartTimes(); 

$available_slots = array(); 

$period = new DatePeriod($start, $interval, $end); 

foreach($period as $time) { 

    $timeslot = $time->format('H:i'); 

    if ($timenow > $time) { 
     continue; 
    }    

    if(array_key_exists($timeslot, $time_slots)) { 
     if($time_slots[$timeslot] == SLOTS) { 
      $available_slots[] = array('key' => $timeslot, 'value' => 'FULL'); 
      continue; 
     } 
    } 

    $available_slots[] = array('key' => $timeslot, 'value' => $timeslot); 
}