У меня есть простая переменная, которая добавляет один месяц к сегодняшнему дню:
$endOfCycle = date("Ym", strtotime("+1 month"));
Сегодня январь 2013 года, поэтому я ожидаю, что вернусь к 2013-02, но вместо этого я получаю 2013-03. Я не могу понять, почему он прыгает в марте.
Он прыгает в марте, потому что сегодня 29 января, а добавление месяца дает 29 февраля, которого нет, поэтому он переходит на следующую действительную дату.
Это произойдет и в течение 31-го числа месяцев, но, очевидно, более заметно в случае с января по февраль, потому что феврь короче.
Если вас не интересует день месяца и просто хочу, чтобы он дал следующий месяц, вы должны указать дату ввода как первую из текущего месяца. Это всегда даст вам правильный ответ, если вы добавите месяц.
По той же причине, если вы хотите всегда получать последний день следующего месяца, вы должны начать с вычисления первого месяца после того, как вы захотите, и вычесть день.
Это должно быть
$endOfCycle=date('Ym-d', strtotime("+30 days"));
strtotime
ожидает, что будет предоставлена строка, содержащая формат даты на английском языке в США, и попытается проанализировать этот формат в временную метку Unix (количество секунд с 1 января 1970 года 00:00:00 по UTC) по сравнению с меткой времени, указанной в настоящее время, или текущее время, если теперь не предоставляется.
в то время как
date
Возвращает строку, отформатированную в соответствии с заданной строкой формата, используя заданную метку времени или текущее время, если не указана метка времени.
См. Страницы руководства для:
Вы можете использовать этот код для получения следующего месяца:
$ts = mktime(0, 0, 0, date("n") + 1, 1); echo date("Ymd H:i:s", $ts); echo date("n", $ts);
Предполагая сегодня 2013-01-31 01:23:45
выше, вернется:
2013-02-01 00:00:00 2
сегодня 29 января, +1 месяц означает 29-е февраля, но поскольку февраль состоит из 28 дней в этом году, он накладывается на следующий день, который составляет 1 марта
вместо этого попробуйте
strtotime('next month')
Может быть, потому, что его 2013-01-29 так что +1 месяц будет в 2013-02-29, которого не существует, так что это будет 2013-03-01
Вы можете попробовать
date('m/d/yh:i a',(strtotime('next month',strtotime(date('m/01/y')))));
из комментариев по http://php.net/manual/en/function.strtotime.php
попробуй это:
$endOfCycle = date("Ym", time()+2592000);
это добавляет 30 дней, а не ровно месяц.
$endOfCycle = date("Ym", mktime(0, 0, 0, date("m", time())+1 , 15, date("m", time())));