Найти следующее повторение еженедельного события, если задано значение даты PHP "N" - PullRequest
0 голосов
/ 02 октября 2018

У меня есть значение дня недели, доступное в формате PHP («N», $ stamp) формат + время с начальным часом события.Я хочу показать дату следующей недели, если событие уже началось, и дату этой недели, если это произойдет в будущем.Временной горизонт составляет 7 дней, поэтому, если «сейчас» прошло, ожидаемое повторение наступает через 7 дней.

Пример

now() is tuesday, 2/10/2018, 13:00
$row['weekday'] = 2 (for tuesday)
$row['time'] = 13:01
$next should be 9/10/2018

против

now() is tuesday, 2/10/2018, 13:00
$row['weekday'] = 2 (for tuesday)
$row['time'] = 12:00
$next should be 2/10/2018

Вот документация PHP в формате времени "N":

N Числовое представление дня недели в ISO-8601 (добавлено в PHP 5.1.0) 1 (дляС понедельника по 7 (для воскресенья)

Я немного исследовал и не смог найти никакого решения для этого.Единственное, что я нашел, было это , на котором я основал следующий (некрасивый, нерабочий) код.

$next = (intval(date("N", strtotime("now"))) !== intval($row['weekday']))
              ?
                (
                  date("d.m.Y", strtotime(
                    date("Y-m-d", strtotime("now")-strtotime("+". (date("w", strtotime("now")) +0) ." day"))
                  )+strtotime("+".$row['weekday']." day"))
                )
                :
                (
                  (
                    (strtotime("now"))
                    <
                    (( strtotime(
                      date("Y-m-d", strtotime("now")-strtotime("+". (date("w", strtotime("now")) +0) ." day"))
                    )+strtotime("+".$row['weekday']." day")+strtotime($row['time'])))
                  )
                  ?
                  (date("d.m.Y", strtotime("now")))
                  :
                  (date("d.m.Y", strtotime("now +1 week")))
                  )

              )

Есть идеи, как справиться с этим?

1 Ответ

0 голосов
/ 02 октября 2018

Вы должны использовать \ DateTime, а не date ():

$eventDate = \DateTime::createFromFormat("Y-m-d H:i:s", $date);
$today = \DateTime::createFromFormat("N", $weekDay);

$next = clone $today;

if ($today > $eventDate) {
  $next->modify("+1 week"); //$next->add(new \DateInterval("P1W"))
  //Eventually also set time
}

EDIT:

$now = new \DateTime();
$date = \DateTime::createFromFormat("D", "Tue"); //W and N are not working

$dayPeriod = new \DateInterval("P1D");

//Check if in last week
if ($date->format("W") < $now->format("W")) {
    $date->add($dayPeriod);
}
//Check if in current week
if ($date->format("W") === $now->format("W")) {
    $date->add($dayPeriod);
}

echo $date->format("Y-m-d");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...