Я показываю дату на веб-сайте для компании, которая проводит встречи каждые две недели. У меня проблема с отображением следующей даты.
Например, если текущая встреча состоится 16 сентября 2014 г., дата должна показывать 30 сентября 2014 г.
Однако, если до 30 сентября 2014 года осталось меньше недели, в этом примере дата будет отображаться через неделю; 7 октября 2014 года, что неверно.
Вот код, который я использую:
<?php
$dow = 'tuesday';
$step = 2;
$unit = 'W';
$start = new DateTime(gmdate("Y-m-d", time()));
$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);
$count = 0;
echo('<h3>');
foreach ($period as $date) {
if($count < 1){
echo $date->format('D, d M Y'), PHP_EOL;
}
$count+=1;
}
echo('</h3>');
?>
Если встречи проводятся каждую вторую неделю, вы можете рассчитывать на номер недели.
например если встреча проводится во вторник каждую четную неделю, вы можете попробовать это:
<?php
$today= new DateTime();
$nextTuesday = strtotime("next tuesday");
$week = $today->format("W");
echo("See you on ");
if($week % 2 == 0){
echo(date("D d/m/Y",strtotime("+7 day", $nextTuesday)));
}
else {
echo(date("D d/m/Y",$nextTuesday));
}
?>
Ваш пример кода не соответствует описанию вашей проблемы.
Поскольку вы используете текущую метку времени через new DateTime(gmdate("Y-m-d", time()));
PHP не знает, когда была последняя встреча, и просто вычисляет 2 недели со следующего вторника, с сегодняшнего дня.
Способ сделать то, что вы описываете, используя DateTime, установив фиксированный момент времени:
$dow = 'tuesday';
$step = 2;
$unit = 'W';
$start = new DateTime('2014-09-16');
$start->modify($dow);
$start->add(new DateInterval("P{$step}{$unit}"));
echo '<h3>'
. $start->format('D, d M Y')
. '</h3>';
Если вы хотите вывести все даты собраний на следующий год (как показывает ваш код):
$dow = 'tuesday';
$step = 2;
$unit = 'W';
$start = new DateTime('2014-09-16');
$start->modify($dow);
$end = clone $start;
$end->add(new DateInterval('P1Y'));
$interval = new DateInterval("P{$step}{$unit}");
while ($start < $end) {
$start->add($interval);
echo '<h3>'
. $start->format('D, d M Y')
. '</h3>';
}
Вместо того, чтобы изобретать велосипед, вы можете использовать
углерод — хорошо известная библиотека PHP DateTime. Он будет обрабатывать все, что связано с DateTime для вас. Попробуй.
Вот быстрый взгляд на Карбон. Чтобы добавить 2 недели, вы можете использовать
echo Carbon::now()->addWeek(2);
Добавить 2 недели с указанной даты, скажем, 10 сентября 2014
echo Carbon::createFromDate(2014, 9, 10)->addWeek(2);