Добавление одного дня к дате


172

Мой код для добавления одного дня к дате возвращает дату до дня добавления: 2009-09-30 20:24:00дата после добавления одного дня ДОЛЖНА быть перенесена на следующий месяц:1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

Я использовал довольно похожий код раньше, что я здесь делаю не так?

Ответы:


333
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

Для PHP 5.2.0+ вы также можете сделать следующее:

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');

3
Спасибо. Решено это как: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 day"));
Ян

11
Вы не должны использовать переменную в строке. Вы должны использовать: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));как в ответе, который дал вам @ w35l3y.
Cas Bloem

Вы должны добавить вызов функции date_default_timezone_set перед запуском этого кода. Например, добавьте date_default_timezone_set («Европа / Рим»);
Лука

96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";

6
Это более новое -совершенное решение.
Cas Bloem

... Пока это не вызывает фатальных ошибок при запуске на вашем хосте;)
Хенрик Эрландссон

Не извиняйся. Некоторые люди опубликовали ответ дамы через 3 года после того, как вы это сделали,
говорит Моуг, восстановите Монику

1
Вы должны добавить вызов функции date_default_timezone_set перед запуском этого кода. Например, добавьте date_default_timezone_set («Европа / Рим»);
Лука

@ LucaMastrostefano нет, у вас должен быть установлен часовой пояс на вашем сервере ...
MH

28

Самое простое решение:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');

Мне нравится ваш путь в одном лайнереecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Аба

@Aba Я не думаю, что ваш один лайнер работает в более старых версиях PHP, потому что я попробовал его, и я получил ошибку:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary

25

Это сработало для меня: на текущую дату

$date = date('Y-m-d', strtotime("+1 day"));

для любой даты:

date('Y-m-d', strtotime("+1 day", strtotime($date)));

2
спасибо, это сработало для меня. Самое простое из всех приведенных решений.
Пунит Верма

2
вам не нужно повторять и вкладывать strtotime()- он может обрабатывать все за один вызов:date('Y-m-d', strtotime($date . " +1 day"));
billynoah

2
Отлично, это самое простое решение! Спасибо
Ангел


6

Простой для чтения и понимания способ:

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;

3
Это иногда не срабатывает при переходе на летнее время, если продолжительность дня не равна 24 часам.
Ник Доу

3

Я всегда просто добавляю 86400 (секунд в день):

$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

Это не самый лучший способ, которым вы могли бы это сделать, но это работает!


Как вы справляетесь с дополнительными секундами, когда добавление 86400 не будет работать, поскольку в этот день будет 86401 секунда? (хорошо, я знаю, что это происходит только раз в несколько лет, но в зависимости от приложения это может быть важно)
Глен

1
Не во всех днях 86400 секунд. Фактически, в большинстве мест в США на 3600 меньше или дополнительных секунд два раза в год.
Питер Ковач

1
Вы можете спокойно игнорировать високосные секунды, так как "Unix time" делает. Это несколько сложно, но прочитайте эту статью для получения дополнительной информации: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Кристиан Давен

2
Вам следует избегать этого решения. Вот почему: stackoverflow.com/questions/2613338/…
mspir

1
Не добавляйте дату, добавив 86400 секунд к предыдущему дню! У вас будет ошибка в вашем коде! Это не работает в летнее время!
sbrbot

1

Хотя я согласен с ответом Дуга Хейса, я перезвоню здесь, чтобы сказать, что причина, по которой ваш код не работает, заключается в том, что strtotime () ожидает INT как второй аргумент, а не строку (даже тот, который представляет дату)

Если вы включите максимальное сообщение об ошибке, вы увидите это как ошибку «Не правильно сформированное числовое значение», которая является уровнем E_NOTICE.


1

modify()Метод , который может быть использован для добавления приращения к существующемуDateTime значению.

Создайте новый DateTimeобъект с текущей датой и временем:

$due_dt = new DateTime();

Получив DateTimeобъект, вы можете манипулировать его значением, добавляя или вычитая периоды времени:

$due_dt->modify('+1 day');

Вы можете прочитать больше в руководстве по PHP .


0

Следующий код получает первый день января текущего года (но это может быть другая дата) и добавляет к этому дню 365 дней (но может быть и N дней), используя класс DateTime и его метод modify () и format ( ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');

0

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

Часто вы сталкиваетесь с проблемой с точки зрения решения. Это только одна из причин, по которой вы получаете императивный код. Это здорово, если это работает, хотя; Есть только другие, возможно, более приемлемые альтернативы. Одним из них является декларативный код. Дело в том, что вам нужно, а не как туда добраться.

В вашем конкретном случае это может выглядеть следующим образом. Во-первых, вам нужно выяснить, что именно вы ищете, то есть открыть абстракции. В вашем случае, похоже, вам нужно свидание . Не просто любая дата, а та, которая имеет какое-то стандартное представление. Скажем, дата ISO8601. Существует как минимум две реализации: первая - это дата, проанализированная из строки в формате ISO8601 (или фактически строки в любом другом формате), а вторая - какая-то будущая дата, которая будет днем ​​позже. Таким образом, весь код может выглядеть так:

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

Для большего количества примеров с манипулированием датой и временем проверьте этот .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.