$ дата + 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 рік". Дякую!
Matt

16
Хіба це не зламається у разі високосного року?
Jeremy1026

1
Починаючи з PHP 5.1, при виклику без аргументів mktime () видає повідомлення E_STRICT: використовуйте замість цього функцію time ().
svandragt

Тут також проголосували проти. Кількість секунд у день, днів у році, секунд у році і т. Д. - усі змінні. Якщо вас цікавить "через рік", ви повинні пройти через інтервал "один рік". Поділ самостійно - це те, що призводить до помилок навколо високосних днів та високосних секунд та зміни переходу на літній час. Гірше того, це спричиняє неміцні модульні тести.
дроберт

чому моя відповідь проти? $ addedoneyear = дата ("у") + 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));про що згадувалося нижче.
Даллін,

9

Спробуйте: $futureDate=date('Y-m-d',strtotime('+1 year',$startDate));


Хоча це повертає правильну відповідь, інша фактично також не повертає помилку ... просто неправильну дату.
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'); ?>

Відмінно, я використовую його , щоб отримати в наступному році: $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()

3

strtotime()повертається bool(false), оскільки не може проаналізувати рядок '+one year'(він не розуміє "один"). falseпотім неявно призначається до integerмітки часу 0. Це гарна ідея перевірити strtotime()вихідні дані не bool(false)раніше, ніж переходити до інших функцій.

З документів:

Повернені цінності

Повертає відмітку про час успіху, інакше - FALSE. До PHP 5.1.0, ця функція повертала -1 при відмові.


Так, хороший момент. У моєму виробничому коді це буде, але я рвав волосся, намагаючись змусити це працювати, тому позбавив його якомога менше коду. Дякую!
Matt

2

Спробуйте це

$nextyear  = date("M d,Y",mktime(0, 0, 0, date("m",strtotime($startDate)),   date("d",strtotime($startDate)),   date("Y",strtotime($startDate))+1));

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 днів :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.