2016-05-12 11 views
0

Ich muss eine wiederkehrende Aufgabe planen, die einmal alle X Wochen an einem oder mehreren Wochentagen auftritt. z.B. alle 3 Wochen, donnerstags und samstags.Wie berechne ich den Unterschied zwischen (Kalender-) Wochen in PHP?

Normalerweise, wenn die Aufgabe nur einmal pro Woche auftreten würde, wäre ich in der Lage, die Differenz in Tagen zwischen heute und dem letzten Tag, wenn das Ereignis ausgelöst wurde, und dividieren durch 7, um die Woche Unterschied zu erhalten . Da die Aufgabe möglicherweise mehrmals pro Woche ausgeführt wird, kann ich diesen Ansatz nicht verwenden.

war meine Idee, den Unterschied zwischen den Kalenderwochen und verwenden diesen Wert zu berechnen, um zu bestimmen, ob die geplante Aufgabe sollte in der laufenden Woche ausgeführt werden:

$lastCW = date('W', strtotime($last_trigger_date)); 
$currentCW = date('W'); 
$cwDifference = $currentCW - $lastCW; 

if (($cwDifference == $repeat_interval) || ($cwDifference == 0)) { 
    // run some code 
} 

Dieser Code funktioniert gut, wenn beide Daten sind im gleichen Jahr, aber es gibt ein Problem, wenn sich das Intervall über zwei Jahre erstreckt und der Kalenderwochenunterschied negativ wird.

Was ist der beste Weg, damit umzugehen?

+0

Verwendung http://php.net/manual/en/datetime.modify.php '$ Datum-> ändern ('+ 1 Woche ') ' –

+0

sollten Sie sie nicht in Daten bis zum Ende konvertieren. Sie sollten stattdessen den Unix-Zeitstempel der aktuellen Woche durch den Unix-Zeitstempel der letzten Woche subtrahieren. – Derek

Antwort

1

Ich schließe immer das nestbot/carbon Paket in allen meinen Projekten ein. Es ist eine viel einfachere und sauberere Art, mit Daten in PHP zu arbeiten. Tatsächlich erweitert es die PHP DateTime-Klasse, sodass Sie es sogar zusammen mit vanille DateTime-Objekten verwenden können.

Ihr Snippet wie folgt aussehen würde, wenn Sie, wo Kohlenstoff verwenden:

$now = new Carbon(); 
$previous = new Carbon($last_trigger_date); 

if ($now->diffInWeeks($previous) == $repeat_interval) { 
    // do your thing 
}