2016-07-20 2 views
1

Ich habe einen Datumsbereich, der von MySQL stammt, zum Beispiel: 2016-01-05 bis 2016-01-10. Ich würde gerne überprüfen, ob sowohl Samstag als auch Sonntag in diesem Datumsbereich liegen, nicht unbedingt in Folge. Bisher habe ich gefunden:Wie kann ich überprüfen, ob ein Datumsbereich ein Wochenende umfasst?

function isWeekend($date) { 
    return (date('N', strtotime($date)) >= 6); 
} 

So würde ich für jeden einzelnen Tag im Bereich Schleife zu sehen, ob es ein Wochenende Tag ist.

Gibt es bessere Ansätze?

+1

Sind die Daten immer kürzer als 7 Tage? – Ares

+0

@Ares manchmal können die Daten beliebig lang sein. – reddish

Antwort

1

Sie müssen nicht alle Tage durchlaufen. Sie müssen nur die Länge des Datumsbereichs und den Wochentag des ersten Tages kennen.

Angenommen, Sie haben zwei DateTime Objekte:

$start = new DateTime('2016-01-05'); 
$end = new DateTime('2016-01-10'); 

Sie können bestimmen, ob ein Samstag und Sonntag im Datumsbereich enthalten sind, durch Prüfen, ob die Länge des Bereichs sowie der numerische Wochentag des Startdatums größer ist als 6. in der DateInterval die Gesamtzahl der Tage kehrt

function includes_weekend (DateTime $start, DateTime $end) { 
    return $start->diff($end)->format('%a') + $start->format('w') > 6; 
} 

format('%a') von diff zurückgegeben und format('w') der numerischen Tag der Woche zurückkehrt (Sunda y = 0).

0

Sie müssten nicht jeden einzelnen Tag überprüfen.

Ich werde versuchen, dieses einfaches Englisch mit nur zu erklären:

Zuerst prüfen, ob es an einem Wochenende beginnt. Wenn dies der Fall ist, sind Sie bereits fertig. Wenn die Zeitspanne mehr als 6 Tage beträgt, können Sie sofort davon ausgehen, dass ja ein Wochenendtag enthalten ist. Wenn es 5 Tage ist, dann muss der erste Tag an einem Montag sein, sonst enthält es einen Wochenendtag. Wenn es vier ist, hat es an einem Dienstag zu sein ... und so weiter.

+0

Vielen Dank für Ihre Antwort, aber Ihre Logik ist fehlerhaft. Wenn mein Datumsbereich am Samstag beginnt und am Dienstag endet, ist der erste Tag nie Montag. – reddish

+0

Es tut mir leid, ich hätte klarstellen müssen. Überprüfen Sie immer den ersten Tag, um zu sehen, ob es ein Wochenende ist. Das sollte den Randfall beseitigen. – Ares