PHP Newb, так что извините за простоту вопроса.
Я пытаюсь создать небольшое эхо, показывающее «следующую дату доставки» на основе двух параметров: даты начала и интервала (в днях или неделях).
Что я особенно хочу, так это чтобы у вас была возможность, например, ввести сегодня «дату начала» и интервал (скажем, «3 недели») и получить скрипт, возвращающий «ваша следующая доставка в XXX» с XXX будущий предстоящий трехнедельный интервал, наступающий в будущем, включая два дня назад, когда он переключается на «завтра». В фактическую дату он переходит к следующему периоду (доставка не может быть заказана в дату поставки) в бесконечность или некоторую реалистичную дату в будущем (следующие 5 лет?)
Это возможно? Я просмотрел предыдущие вопросы, и, кажется, довольно тривиально добавить заблокированную дату (дата + установленный период в будущее), но я не сталкивался с тем, что смотрит на текущую дату и думает о том, что будет дальше повторение будет … отсюда мой вопрос здесь.
Вы могли бы использовать DatePeriod за это. DatePeriod
возьму DateTime
Объект в качестве даты начала, для первого параметра, DateInterval
объект как интервал, на котором нужно повторить, для второго параметра, и DateTime
объект или целое число, представляющее дату окончания или число повторений за период.
Так, например, если у вас есть начальная дата сегодня и 3-недельный интервал, вы можете получить дату доставки примерно так …
$start = new DateTime('today');
$interval = new DateInterval('P3W');
$period = new DatePeriod($start, $interval, 1, DatePeriod::EXCLUDE_START_DATE);
foreach($period as $deliveryDate) {
echo "Next delivery date: " . $deliveryDate->format('Y-m-d');
}
Это должно дать вам что-то вроде …
Next delivery date: 2015-08-11
Вы настоятельно рекомендуете использовать для этого классы DateTime, DateInterval, DatePeriod. Это может выглядеть так:
$start_date = '2015-07-21'; // or whatever date you get from some location
// create a DateTime object that represents start of sequence
$start_datetime = DateTime::createFromFormat('Y-m-d', $start_date);
// create a DateTime object representing the current date/
$current_datetime = new DateTime('today');
$date_interval = new DateInterval('P3W'); // for 3 weeks
// determine end date for DatePeriod object that will later be used
// this is no further out than current date plus the interval
$end_datetime = new DateTime('today');
$end_datetime->add($date_interval);
$date_period = new DatePeriod($start_datetime, $interval, $end_datetime, DatePeriod::EXCLUDE_START_DATE);
// at this point, you simply need to grab last item from $date_period to get next delivery
// unfortunately there is no array access on this object, so you just need to iterate until the end
foreach($date_period as $dp) {
$next_delivery = $dp;
}
// echo date from next delivery
echo $next_delivery->format('Y-m-d');