$ дата + 1 год?

87

Я пытаюсь назначить дату через год с указанной мной даты.

Мой код выглядит так:

$futureDate=date('Y-m-d', strtotime('+one year', $startDate));

Возвращается неправильная дата. Есть идеи, почему?

Мэтт
источник
9
Вы забыли сообщить об ошибке.
BalusC
Фрэнк Фармер: вы так уверены? Я бы предпочел дождаться уведомлений / комментариев OP.
BalusC
В спешке опубликовать это вчера вечером я забыл уточнить - возвращалась неправильная дата. Сожалею! Спасибо за вашу помощь.
Мэтт,
1
Используйте его так, вместо этого strtotime ('+ 1 год', $ startDate));
casivaagustin

Ответы:

97

Чтобы добавить один год к сегодняшней дате, используйте следующее:

$oneYearOn = date('Y-m-d',strtotime(date("Y-m-d", mktime()) . " + 365 day"));

Для других примеров вы должны инициализировать $ StartingDate значением отметки времени, например:

$StartingDate = mktime();  // todays date as a timestamp

Попробуй это

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 365 day"));

или

$newEndingDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime($StaringDate)) . " + 1 year"));
Нидхин Бэби
источник
Добавление «+365» вместо «+1 год» сделало это. Благодарность!
Мэтт,
16
Разве это не перерыв в случае високосного года?
Jeremy1026
1
Начиная с PHP 5.1, когда вызывается без аргументов, mktime () выдает уведомление E_STRICT: вместо этого используйте функцию time ().
svandragt
Здесь тоже проголосовали против. Количество секунд в дне, дней в году, секунд в году и т.д. - все это переменные. Если вас интересует «через год», вы должны пройти через интервал «один год». Самостоятельное разделение приводит к ошибкам, связанным с високосными днями и секундами, а также к изменениям летнего времени. Хуже того, это вызывает нестабильные модульные тесты.
drobert
почему мой ответ отвергнут ?? $ addedoneyear = дата ("y") + 1; // для добавления одного года что с этим не так?
pathe.kiran
212
$futureDate=date('Y-m-d', strtotime('+1 year'));

$ futureDate через год!

$futureDate=date('Y-m-d', strtotime('+1 year', strtotime($startDate)) );

$ futureDate составляет один год от $ startDate!

Мишо
источник
Обратите внимание, что если $ startDate уже является меткой времени (например, созданной ранее с помощью функции time () или mktime ()), а не строкой, вам не следует заключать ее в strtotime, иначе она не будет работать. Вместо этого сделайте $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));как K Prime, упомянутый ниже.
dallin
9

Пытаться: $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));

K Prime
источник
Хотя это возвращает правильный ответ, другой на самом деле тоже не возвращает ошибку ... просто неправильную дату.
SeanJA
1
strtotime не вызывает ошибок. В случае ошибки возвращает false.
Фрэнк Фармер,
PHP выдает предупреждения, если часовой пояс по умолчанию не установлен ... хотя, очевидно, он имел в виду не это
SeanJA
Я получаю ошибку на ваш код я изменил , ,чтобы .и она работала date("Y-m-d",strtotime('+1 year '.$startDate));
Мухаммад Билал,
7
// Declare a variable for this year 
$this_year = date("Y");
// Add 1 to the variable
$next_year = $this_year + 1;
$year_after = $this_year + 2;

// Check your code
    echo "This year is ";
    echo $this_year;
    echo "<br />";
    echo "Next year is ";
    echo $next_year;
    echo "<br />";
    echo "The year after that is ";
    echo $year_after;
Анархия
источник
6

была такая же проблема, но это было самое простое решение:

<?php (date('Y')+1).date('-m-d'); ?>
Gardenee
источник
Отлично, я использую его , чтобы получить в следующем году: $next_year = (date('Y')+1).
Мартин
5
//1 year from today's date
echo date('d-m-Y', strtotime('+1 year'));

//1 year from from specific date
echo date('22-09-Y', strtotime('+1 year'));

надеюсь, что этот более простой фрагмент кода поможет кому-то в будущем :)

Разработчик
источник
4

Я предпочитаю OO-подход:

$date = new \DateTimeImmutable('today'); //'today' gives midnight, leave blank for current time.
$futureDate = $date->add(\DateInterval::createFromDateString('+1 Year'))

Используйте, DateTimeImmutableиначе вы тоже измените исходную дату! подробнее о DateTimeImmutable: http://php.net/manual/en/class.datetimeimmutable.php


Если вы просто хотите с сегодняшнего дня, вы всегда можете сделать:

new \DateTimeImmutable('-1 Month');
Эндрю Аткинсон
источник
3

Если вы используете PHP 5.3, это потому, что вам нужно установить часовой пояс по умолчанию:

date_default_timezone_set()
SeanJA
источник
3

strtotime()возвращается bool(false), потому что не может проанализировать строку '+one year'(не понимает «один»). falseзатем неявно приводится к integerметке времени 0. Перед тем, как вставить его в другие функции , рекомендуется убедиться, strtotime()что результат не соответствует bool(false)действительности.

Из документов:

Возвращаемые значения

В случае успеха возвращает отметку времени, в противном случае - FALSE. До PHP 5.1.0 эта функция возвращала -1 в случае ошибки.

Фрэнк Фармер
источник
Да, хорошее замечание. В моем производственном коде это будет, но я рвал на себе волосы, пытаясь заставить это работать, поэтому сократил его до минимального количества кода. Благодарность!
Мэтт,
2

Попробуй это

$nextyear  = date("M d,Y",mktime(0, 0, 0, date("m",strtotime($startDate)),   date("d",strtotime($startDate)),   date("Y",strtotime($startDate))+1));
Treby
источник
1

Есть также более простое и менее изощренное решение:

$monthDay = date('m/d');
$year = date('Y')+1;
$oneYearFuture = "".$monthDay."/".$year."";
echo"The date one year in the future is: ".$oneYearFuture."";
Даниэль Лима
источник
1

Мое решение: date('Y-m-d', time()-60*60*24*365);

Вы можете сделать его более «читабельным» с помощью определений:

define('ONE_SECOND', 1);
define('ONE_MINUTE', 60 * ONE_SECOND);
define('ONE_HOUR',   60 * ONE_MINUTE);
define('ONE_DAY',    24 * ONE_HOUR);
define('ONE_YEAR',  365 * ONE_DAY);

date('Y-m-d', time()-ONE_YEAR);
Адам Местер
источник
-1

В моем случае (я хочу добавить 3 года к текущей дате) решение было:

$future_date = date('Y-m-d', strtotime("now + 3 years"));

Гардени, Треби и Даниэлю Лиме: что будет с 29 февраля? Иногда в феврале бывает всего 28 дней :)

Айуэн
источник