datetime — PHP Date через две недели показывает неверное значение каждую вторую неделю

Я показываю дату на веб-сайте для компании, которая проводит встречи каждые две недели. У меня проблема с отображением следующей даты.

Например, если текущая встреча состоится 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>');

?>

0

Решение

Если встречи проводятся каждую вторую неделю, вы можете рассчитывать на номер недели.

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

<?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));
}
?>
0

Другие решения

Ваш пример кода не соответствует описанию вашей проблемы.

Поскольку вы используете текущую метку времени через 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>';
}
0

Вместо того, чтобы изобретать велосипед, вы можете использовать
углерод — хорошо известная библиотека PHP DateTime. Он будет обрабатывать все, что связано с DateTime для вас. Попробуй.

Вот быстрый взгляд на Карбон. Чтобы добавить 2 недели, вы можете использовать

echo Carbon::now()->addWeek(2);

Добавить 2 недели с указанной даты, скажем, 10 сентября 2014

echo Carbon::createFromDate(2014, 9, 10)->addWeek(2);

0
По вопросам рекламы [email protected]