2016-08-16 4 views
0

Frage nach Datum Funktion in PHP Ich möchte einen Datumsbereich in einer Woche (Montag-Samstag), dass das Datum gleich dem heutigen Datum in einer Dropdown-Option folgen. Sagen wir heute am 16. August, dann wird der Bereich vom 15. August bis zum 20. August, vom 22. August bis zum 27. September, vom 29. August bis zum 3. September usw. beginnen.Ranging Datum gleich heute Datum

Ich benutze diese Syntax

<?php 
    for ($i = 0; $i < 8; $i++) { 
    echo '<option value="'.date("Ymd", strtotime("$i weeks monday")).'">'.date("d F", strtotime("$i weeks monday"))." - ".date("d F", strtotime("$i weeks saturday")).'</option>'; 
    } 
    } 
?> 

Es funktioniert in Montag nur perfekt, aber am nächsten Tag, wenn ich die Web öffnen, zeigt es Montag nächste Woche für alle Option. Es scheint, dass, wenn Montag verging, dieser Montag ist aus der Liste in dieser Woche und nächsten Montag wird diese Woche Montag. Es ist ein Fehler mit strtotime oder es gibt eine bessere strtotime Syntax zu verwenden? Wenn möglich, möchte ich vermeiden, zu verwenden, wenn Datum zu überprüfen, aber wenn nicht, dann gibt es eine mögliche einfache Syntax in Strtotime zu verwenden?

Antwort

0

Dies ist schwierig mit strtotime() und doppelt so wie ein Einzeiler zu tun. Mit DateTime() and it's related classes wird dies jedoch einfach.

$start = new DateTimeImmutable('Monday this week'); 
$end  = $start->add(new DateInterval('P8W')); 
$interval = new DateInterval('P1W'); 
$period = new DatePeriod($start, $interval, $end); 
foreach ($period as $week) { 
    $monday = $week->format('Ymd'); 
    $saturday = $week->modify('next Saturday')->format('Ymd'); 

    printf('<option value="%s">%s - %s</option>', $monday, $monday, $saturday); 
} 

Demo

Was hier passiert, ist:

  1. Verwenden DateTimeImmutable() unseren Starttermin zu erstellen, das der Montag der aktuellen Woche ist
  2. Unser Enddatum 8 Wochen sein von Jetzt (unter Verwendung von DateInterval())
  3. Legen Sie das Intervall für unsere Schleife auf eine Woche Zeiträume
  4. Setzen Sie alles in ein DatePeriod() Objekt, das wir durch
  5. Holen Sie sich das Format für unseren Montag Datum
  6. Holen Sie sich das Format für unser Samstag Datum
  7. Echo it out in einem <option>-Tag (mit printf() so ist es laufen können (in unserem Code besser lesbar)
+0

was bedeutet P1w/P8W bedeutet im Intervall? Verwenden Sie niemals DateTimeImmutable() vor –

+0

'P1W ~ bedeutet" Zeitraum 1 Woche ". Von dort können Sie raten, was "P8W" bedeutet. :) 'DateTimeImmutable()' ist genau wie 'DateTime()', gibt aber immer ein neues Objekt zurück, anstatt das Original zu ändern. Je nachdem, was Sie tun, ist es egal, welche Sie verwenden. –

+0

Ich habe es versucht und es funktioniert, vielen Dank. Ich hoffe, es ist nicht kaputt, wenn sich der Tag ändert. Wenn ich strtotime benutze ('Montag diese Woche'), kommt das Ergebnis wie ich es vorher beschrieben habe in Frage. Aber wenn in Ihrem Code funktioniert es sogar die Zeile ist genau das gleiche? Weißt du etwas darüber ? –

Verwandte Themen