В следующем месяце в тот же день в PHP - PullRequest
12 голосов
/ 06 июня 2009

У меня есть «событие», которое должно быть запланировано на один и тот же день каждого месяца.

Скажем, вы установили дату начала 1 мая, вы должны получить следующие события 1 июня, 1 июля и т. Д. Проблема связана с датой начала 31 мая (следующие могут быть 30 или 28 в зависимости от месяц).

Учитывая, что есть месяцы с разным количеством дней (28, 30, 31) в зависимости от самого месяца и года ... что было бы простым способом установить это?

Рассмотрим следующую (и ошибочную) функцию nextmonth:

$events = array()

function nextmonth($date) {
   return $date+(60*60*24*30);
}
$curr = $start;
while($curr < $end) {
    $events[ = $curr;
    $curr = nextmonth($curr);
}

Отредактировано, чтобы добавить: Для меня проблема, достаточно просто, как решить, каково количество дней в любом данном месяце и таким образом получить следующую соответствующую дату.

Ответы [ 16 ]

0 голосов
/ 23 марта 2017

Это то, что я использую

Это отметка времени текущего месяца

$month_timestamp = strtotime(date('Y-m', $create_timestamp));

Текущий день

$current_day = date('d');

И это тот же день следующего месяца в формате "Y-m-d"

$next_month_first = date('Y-m-' . $current_day, strtotime('next month', $month_timestamp));
0 голосов
/ 18 сентября 2015

Дата / время Стиль ООП

<?php
//Start Date -> 18-09-2015
$expiry = new DateTime();
for($i=1;$i<5;$i++){
   $expiry->modify('+1 Month');
   echo $expiry->format('d-m-Y');
   echo '<br>';
}
?>

//18-10-2015
//18-11-2015
//18-12-2015
//18-01-2016
0 голосов
/ 04 июня 2015

У меня тоже была такая же проблема, но когда я попробовал вышеуказанные решения, они не могли работать идеально для меня, я попробовал свои силы и предложил новое решение:

$startDate = date("Y-m-d");
$month = date("m",strtotime($startDate));
$nextmonth = date("m",strtotime("$startDate +1 month"));
if((($nextmonth-$month) > 1) || ($month == 12 && $nextmonth != 1))
{
    $nextDate = date( 't.m.Y',strtotime("$startDate +1 week"));
}else
{
    $nextDate = date("Y-m-d",strtotime("$startDate +1 month"));
}
echo $nextSameDate = date("Y",$nextDate).'-'.date("m",$nextDate).'-'.date("d",$startDate);
0 голосов
/ 17 августа 2012

Я знаю, что это старый пост, но подумал, чтобы дать другой подход.

Таким образом, вместо того, чтобы пытаться вычислить дни в месяце (что несколько сложно), можно легко узнать следующий месяц, используя текущий месяц, например:

date("m", strtotime($current."+1 month"));

Затем получите день текущего месяца, используя date("d"), и сопоставьте его со следующим месяцем из кода выше.

0 голосов
/ 14 июня 2012

Никто не упомянул об этой альтернативе, хотя результат такой же, как у других, и, вероятно, не то, что ищет ОП:

$today = new DateTime();
$today->modify("+1 month");
echo $today->format("d.m.Y");

Почему бы тогда просто не хранить месяц и день отдельно и увеличивать месяц на единицу, а затем использовать функцию PHP checkdate для проверки даты, уменьшая день на единицу, пока дата не станет действительной?

0 голосов
/ 06 июня 2009

Как насчет этой функции:

    function getNextMonthN($date, $n = 1) {
      $newDate = strtotime('+' . $n . ' months', $date);
      if (date('j', $date) !== (date('j', $newDate))) {
        $newDate = mktime(0, 0, 0, date('n', $newDate), 0, date('Y', $newDate));
      }
      return $newDate;  
    }

Существует другое решение на сайте руководства php.net в разделе strtotime в комментариях .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...