php-работа с датами типа " каждые две недели по вторникам"

У меня есть приложение для веб-планирования, которое я в настоящее время переписываю, и у меня есть некоторые вопросы о том, как работать с повторяющимися встречами (я знаю, что нет недостатка в "что лучший способ сделать это", когда дело доходит до повторяющихся приложений).

поэтому я хочу предложить повторяющиеся встречи, где пользователь может назначить встречу, на свидание, как СБ, 2 июня, и он должен повторяться каждые две недели в субботу в течение некоторого заранее определенного периода времени (например, 1 год.)

какие функции php могут помочь мне определить, на какую дату приходится "каждая вторая суббота"? Я прикрепляю изображение моего пользовательского интерфейса для уточнения.

enter image description here

3 ответов


лично я хотел бы работать с DateTime объекты и использовать DateInterval класса.

в приведенном выше случае вам нужно разработать дату первой / следующей субботы, а затем просто работать с интервалом даты P2W

простой пример

$dow   = 'saturday';
$step  = 2;
$unit  = 'W';

$start = new DateTime('2012-06-02');
$end   = clone $start;

$start->modify($dow); // Move to first occurence
$end->add(new DateInterval('P1Y')); // Move to 1 year from start

$interval = new DateInterval("P{$step}{$unit}");
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
    echo $date->format('D, d M Y'), PHP_EOL;
}

/*
Sat, 02 Jun 2012
Sat, 16 Jun 2012
Sat, 30 Jun 2012
Sat, 14 Jul 2012
…
Sat, 20 Apr 2013
Sat, 04 May 2013
Sat, 18 May 2013
Sat, 01 Jun 2013
*/

Ну, я бы сначала установил дату начала; когда этот день пришел, вы просто делаете:

$next_date = strtotime('+2 weeks');

Это получает вас в тот же день, но только две недели спустя. И цикл продолжается :)


вы можете использовать столбец базы данных для хранения времени в секундах:

UPDATE appointments SET dtime=UNIX_TIMESTAMP() WHERE id=5

затем вы можете проверить это значение везде, где только что прошел определенный период:

mysql_query("SELECT id FROM appointments WHERE dtime>='".(strtotime("-1 week"))."');

выбранные идентификаторы-1 неделя или более.