2012-06-02 2 views
6

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

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

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

enter image description here

+1

Stuff like 'strtotime ('Next Saturday')' достаточно легко, если вы не хотите более сложных вещей :) –

+0

Так он используется в календаре для пользователя, где они активно ищут информацию о том, когда их назначение если им нужно напоминание? Или ему нужно отправить им какое-то автоматическое сообщение или что-то в этом роде? –

+0

Hi Max, мое приложение позволяет пользователям назначать встречи, а затем отправляет напоминания своим клиентам о предстоящем назначении. В этом случае я хочу приспособиться для того, чтобы пользователь забронировал встречу «каждую неделю в субботу» (или любую другую комбинацию, которую может создать мой пользовательский интерфейс). Мое беспокойство заключалось в том, что просто добавление 14 дней (в данном случае) не всегда означает, что назначение будет падать в субботу. – Greg

ответ

14

Лично я хотел бы работать с 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 
*/ 
+0

Спасибо за добавление примера salathe –

+0

Я думаю, что это то, что я ищу! Спасибо, Марк. Я собираюсь попробовать это утром, вход очень ценится! – Greg

+0

Привет, Марк, похоже, некоторые из классов, которые вы используете, доступны только в php 5.3.x (DatePeriod, DateInterval). К несчастью, я попытался обновить свой сервер сегодня утром, и он собрал кучу сайтов joomla, в которых я бегу, поэтому мне пришлось вернуться к 5.2.9. Есть ли аналогичный подход к вашему решению, используя какой-то вкус функциональности 5.2.9? – Greg

0

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

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

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

0

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

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

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

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

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

Смежные вопросы