Frage

Ich habe mindestens 2 Dutzend Themen über dieses und habe nicht wirklich eine gute Antwort noch, so dass ich kommen, um Sie zu bitten, noch einmal für die Antworten im Hinblick auf die gefürchtete Thema der sich Wiederholenden Ereignissen.

Ich habe Täglich, Wöchentlich, Monatlich und Jährlich wiederholt arbeiten gut für jetzt (ich brauche noch die Umgestaltung des Systems mit Ausnahme von Veranstaltungen und so weiter, aber es funktioniert vorerst).Aber, wir wollen in der Lage sein, die Fähigkeit zu wiederholen Ereignisse auf der (1., 2., 3., 4., 5.) [Sun|Mon|Tue|Wed|Thu|Fri|Sat], jeden Monat, jeden Monat und alle drei Monate.

Nun, wenn ich nur verstehen, die Logik für jeden Monat, ich kann herausfinden, die jeden Monat und alle drei Monate.

Hier ist ein bisschen was ich habe, so weit (Hinweis:Ich sage nicht, ich habe der beste Weg, es zu tun, oder nichts, aber das system ist eine, die wir update sehr langsam im Laufe der Zeit wenn wir uns nicht mit anderen Projekten beschäftigt, so dass ich den code mehr effiziente als ich die Zeit dazu habe).

Zuerst bekomme ich den Start-und End Datumsangaben formatiert Datums-Berechnungen:

$ending = $_POST['end_month'] . "/" . $_POST['end_day'] . "/" . substr($_POST['end_year'], 2, 2);
$starting = $_POST['month'] . "/" . $_POST['day'] . "/" . substr($_POST['year'], 2, 2);

Dann bekomme ich den Unterschied zwischen den beiden wissen, wie viele Male zu wiederholen, die eine Funktion verwenden, die ich bin ziemlich sicher fand ich hier vor einiger Zeit und dividieren Sie den Betrag durch 28 Tage um sich nur darum, wie viele MALE muss es wiederholen, damit es einen Monat:

$repeat_number = date_diff($starting, $ending) / 28;
//find the difference in DAYS between the two dates
function date_diff($old_date, $new_date) {
$offset = strtotime($new_date) - strtotime($old_date);
return $offset/60/60/24;
}

Dann füge ich (1st,2nd,etc...) Teil der [Sun|Mon|etc...] Teil, um herauszufinden, was Sie sind suchen für die mir somehthing wie 'Sonntag' :

$find = $_POST['custom_number']. ' ' . $_POST['custom_day'];

Dann benutze ich eine Schleife, die läuft mit der Anzahl der Zeiten, muss dies zu wiederholen (die $repeat_number von oben):

for($m = 0; $m <= $repeat_number; $m++) {
if($m == 0) {
     $month = date('F', substr($starting,0,2));
} else {
     $month = date('F', strtotime($month . ' + ' . $m . ' months'));
}
$repeat_date = strtotime($find . ' in ' . $month);
}

Nun, ich bin mir bewusst, dass dieser code nicht funktioniert, habe ich auf einmal habe code, der sich bis der richtige Monat und Jahr für das zu wiederholen, würde aber nicht unbedingt finden am ersten Dienstag oder was auch immer es war, die derzeit gesucht.

Wenn jemand könnte mich wieder in die richtige Richtung, es wäre am meisten geschätzt.Ich habe lauern in der community für einige Zeit jetzt gerade, den Versuch gestartet, aktive Teilnahme, vor kurzem.

Vielen Dank im Voraus für jede Eingabe oder Ratschläge, die Sie bieten können.

War es hilfreich?

Lösung

Hier ist eine mögliche Alternative für Sie. strtotime ist mächtig und Die Syntax enthält wirklich nützliche Teile wie Umfassende relative Zeit- und Datumsschließung.

Sie können es verwenden, um das erste über nte Wochentage eines bestimmten Monats zu generieren, indem Sie das Format "von" verwenden. Hier ist ein Beispiel verwendet date_create A aufrufen a Terminzeit Objekt, aber regelmäßig alt strtotime funktioniert genauso:

php > $d = date_create('Last Friday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Friday March 25 2011 00:00:00
php > $d = date_create('First Friday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Friday March 04 2011 00:00:00
php > $d = date_create('First Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday March 06 2011 00:00:00
php > $d = date_create('Fourth Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday March 27 2011 00:00:00
php > $d = date_create('Last Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday March 27 2011 00:00:00

Es wird auch den Monat überlaufen, wenn Sie nach einem ungültigen fragen:

php > $d = date_create('Ninth Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday May 01 2011 00:00:00

Beachten Sie, dass es nur mit dem funktioniert Ordinalzahl Wortlaut. Leider können Sie "1st" oder "3." nicht bestehen.

Sobald Sie dies verwendet haben, um den richtigen n -ten Wochentag zu erhalten, können Sie einfach die Anzahl der benötigten Wochentage hinzufügen, um zu überspringen (7 für eine Woche, 14 für zwei, 21 für drei usw.), wie bis zum angegebenen Enddatum oder die bestimmte Anzahl von Anzahl Wochen sind vergangen. Noch einmal, strtotime zur Rettung, indem Sie das zweite Argument verwenden, um die Relativität zu ketten:

php > echo date('l F d Y H:i:s', strtotime('+14 days', strtotime('First Thursday of March 2011')));
Thursday March 17 2011 00:00:00

(Meine lokale Kopie wird auch akzeptiert '+14 days First Thursday of March 2011', aber das fühlte sich irgendwie komisch an.)

Andere Tipps

Ich habe eine weitere einfache Methode, obwohl es scheinen mag hack-ish.

Was wir tun können, ist, nehmen Sie das Startdatum, und folgern, dass es "n" - Wert aus, indem die Decke von seinem Tag geteilt durch 7.

Für Beispiel, wenn Ihre start-Datum ist der 18.,, wir teilen durch 7 und nehmen Sie die Decke, um zu folgern, dass es ist das 3. "was-Tag" des Monats.

Von dort aus können wir einfach immer wieder fügen Sie 7 Tage, um das zu bekommen, ein neues Datum, und wenn das neue Datum und die decken 7-quotient ist 3, die wir getroffen haben, die nächste "N-te was-Tag" des Monats.

Einige code kann unten gesehen werden:

$day_nth = ceil(date("j", strtotime($date))/7);
for ($i = 0; $i < $number_of_repeats; $i++) {

    while (ceil(date("j", strtotime($date))/7) != $day_nth)
        $date = date("Y-m-d", strtotime("+7 days", strtotime($date)));

    /* Add your event, or whatever */

    /* Now we increment date by 7 days before the loop starts again,
    ** otherwise the while loop would never execute and we'd just be
    ** adding to the same date repeatedly. */
    $date = date("Y-m-d", strtotime("+7 days", strtotime($date)));
}

Das schöne an dieser Methode ist, dass wir gar nicht haben, um sorgen uns mit, an welchem Tag der Woche, die wir sind Umgang mit.Wir nur folgern, alles aus dem Startdatum und wir gehen Weg.

Ich mache es so:

            //$typeOfDate = 0;
            $typeOfDate = 1;
            $day = strtotime("2013-02-01");
            $to = strtotime(date("Y-m-d", $day) . " +6 month");

            if ($typeOfDate == 0) { //use the same day (number) of the month
                $dateArray[] = date("Y-m-d", $day);
                $event_day_number = date("d", $day);
                while ($day <= $to) {
                    $nextMonth = date("m", get_x_months_to_the_future($day));
                    $day = strtotime(date("Y-" . $nextMonth . "-d", $day));
                    $dateArray[] = date("Y-m-d", $day);
                }
            }

            if ($typeOfDate == 0) { //use the same day (like friday) of the month
                $dateArray[] = date("Y-m-d", $day);
                $monthEvent = date("m", $day);
                $day = strtotime(date("Y-m-d", $day) . " +4 weeks");
                $newMonthEvent = date("m", $day);
                if ($monthEvent == $newMonthEvent) {
                    $day = strtotime(date("Y-m-d", $day) . " +7 days");
                }
                while ($day <= $to) {
                    $dateArray[] = date("Y-m-d", $day);
                    $monthEvent = date("m", $day);
                    $day = strtotime(date("Y-m-d", $day) . " +4 weeks");
                    $newMonthEvent = date("m", $day);
                    if ($monthEvent == $newMonthEvent) {
                        $day = strtotime(date("Y-m-d", $day) . " +7 days");
                    }
                }
            }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top