2017-01-05 4 views
1

Ich habe zwei Veranstaltungen an zwei Tagen pro Woche. Beide beginnen um 13:15 Uhr an jedem Tag. Jeden Dienstag und jeden Donnerstag. Ich muss überprüfen, ob das nächste Ereignis (von jetzt()) Dienstag (bis 13:15) ODER Donnerstag (bis 13:15) ist, um den Javascript-Countdown korrekt zu setzen (es wird das Datum erhalten ("Ymd H: i: s „) string für Zählung)PHP check zwei Daten in einer Woche für contdown

PSEUDO Beispiel:

if(tuesday("13:15") == 'over' && thursday("13:15") == 'remaining') { 
    echo 'Next event start thursday 13:15'; 
    // need time format here for the thursday 
} else { 
    echo 'Next event start tuesday 13:15'; 
    // need time format here for the tuesday 
} 

ich mit Vergleichen der Zeit bin zu kämpfen Bereiche:

$now = new DateTime(date("Y-m-d")); 

$event_time = '13:15'; 
$event_tuesday = new DateTime("next tuesday"); 
$event_thursday = new DateTime("next thursday"); 

echo $diff_tuesday = $event_tuesday->diff($now)->format("%a"); 
echo $diff_thursday = $event_thursday->diff($now)->format("%a"); 

Aber ich denke, dass sowieso falsch ist. Kann mir jemand einen Tipp geben?

Antwort

1

Sie können die Leistung von PHP strtotime benutzen, die Sie sehen, Kommentare im folgenden Code-Schnipsel

Strings wie next Tuesday, next month + 1 day usw. versteht.

Bitte beachten Sie auch, dass Sie muss set the default timezone as appropriate.

// Current instant: 
$now = time(); 

// 13:15 of today's day if it's Tuesday (regardless of the current time), 
// otherwise the next upcoming Tuesday: 
$thisTuesday1315 = strtotime("this Tuesday 13:15"); 

// 13:15 of today's day if it's Thursday (regardless of the current time), 
// otherwise the next upcoming Thursday: 
$thisThursday1315 = strtotime("this Thursday 13:15"); 

if($thisTuesday1315 <= $now || ($now < $thisThursday1315 && $thisThursday1315 < $thisTuesday1315)) { 
    echo 'Next event start: Thursday 13:15'; 
    // You may use the `$thisThursday1315` timestamp here 
} else { 
    echo 'Next event start: Tuesday 13:15'; 
    // You may use the `$thisTuesday1315` timestamp here 
} 
+0

ok in Deutschland zu sichern jetzt haben wir Dienstag 21.18. Wenn ich deinen Code mit Live-Datum versuche: strtotime ("nächsten Dienstag 22:00")> strtotime ("nächsten Donnerstag 22:00") sollte es mir diesen Donnerstag als Antwort geben. aber gibt mir nächsten Dienstag! ..problem ist die "nächste" string ... cos wir haben donnerstag und keine notwendigkeit für die nächste hier. Du verstehst mein Problem? – trajo

+0

@trajo, jetzt verstehe ich das Problem; nachdem ich mit 'strtotime' herumgespielt habe, habe ich herausgefunden, dass' dieser Dienstag

+0

funktioniert wie erwartet und ich markierte es als richtige Antwort! Thx Alex ... @ bitte sieh auch Ali's Lösung. Ein großer Satz von Funktionen für dynmatisch mehr Ereignisse. Aber für meinen Bedarf werde ich Alex benutzen und Alis retten;) – trajo

1

Wir brauchten die aktuelle Zeit in die Gleichung aufzunehmen.

auch auf der Grundlage der Zeit der Veranstaltung wir zum Training haben, wenn das seine diese oder nächsten bestimmten Tag, dies innerhalb der prependThisOrNext() Methode nehmen

In der folgenden Lösung, Sie werden nicht nur begrenzt werden zwei Veranstaltungen pro Woche.

<?php 

function prependThisOrNext($dayAndTime) 
{ 
    $prefix = strtotime($dayAndTime) > strtotime('now') ? 'this ' : 'next '; 
    return $prefix . $dayAndTime; 
} 

function sortEvents($events = []) 
{ 
    $list = []; 
    foreach ($events as $event) { 
     $prependedEvent = prependThisOrNext($event); 
     $list[strtotime($prependedEvent)] = $prependedEvent; 
    } 

    asort($list); 
    return $list; 
} 

function getTheNextEvent($events = []) 
{ 
    $sortedList = sortEvents($events); 
    return array_shift($sortedList); 
} 

$events = ['Tuesday 13:15', 'Thursday 22:15']; 

$nextEvent = getTheNextEvent($events); 

echo 'Next event: ' . $nextEvent; 

Beachten Sie bitte, mit einer solchen Anordnung von freien Strings als Argument arbeiten, werden einige gute Validierung erfordern/:)

+1

Eine großartige Lösung, THX! Ich habe Alex als Antwort markiert, weil er sich nur auf den Logikteil konzentriert hat und schneller war, aber Sie haben ein gutes Beispiel für den dynamischen Gebrauch gegeben. Ich werde es an anderer Stelle brauchen. Ich habe es als nützlich markiert! – trajo