добавление 1 дня к значению формата DATETIME

87

В определенных ситуациях я хочу добавить 1 день к значению моей переменной в формате DATETIME:

$start_date = date('Y-m-d H:i:s', strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}"));

Как лучше всего это сделать?

Ян
источник

Ответы:

63

Если вы хотите сделать это в PHP:

// replace time() with the time stamp you want to add one day to
$startDate = time();
date('Y-m-d H:i:s', strtotime('+1 day', $startDate));

Если вы хотите добавить дату в MySQL:

-- replace CURRENT_DATE with the date you want to add one day to
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY);
RaYell
источник
Разве это не покажет мне текущее время? Мне все еще нужно сохранить введенное пользователем время.
ian
Да, будет, но я отметил, какие значения следует изменить на время, указанное вами. Вы можете просто заменить time()на strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}").
RaYell
это не экономия летом / зимой! Пожалуйста, используйте манипуляции с датой и временем сохранения DST
Стивен
208

Есть несколько способов сделать это с помощью DateTime, представленного в PHP 5.2. В отличие от использования, strtotime()это будет учитывать переход на летнее время и високосный год.

$datetime = new DateTime('2013-01-29');
$datetime->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s');

// Available in PHP 5.3

$datetime = new DateTime('2013-01-29');
$datetime->add(new DateInterval('P1D'));
echo $datetime->format('Y-m-d H:i:s');

// Available in PHP 5.4

echo (new DateTime('2013-01-29'))->add(new DateInterval('P1D'))->format('Y-m-d H:i:s');

// Available in PHP 5.5

$start = new DateTimeImmutable('2013-01-29');
$datetime = $start->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s');
Джон Конде
источник
Ах, петля да петля .
Funk Forty Niner
9
При добавлении более одного дня вы можете использовать множественное или единственное число и получить тот же результат, например: +2 dayили +2 days(очевидно +2 days, более семантически правильно)
timhc22
В чем практические различия между этими методами? Первый пример мне кажется наиболее простым и смысловым.
BadHorsie
24

Конструктор DateTime принимает параметр string time. $timeмогут быть разные вещи, он должен уважать формат datetime .

В качестве примеров можно привести несколько допустимых значений:

  • 'now' (значение по умолчанию)
  • 2017-10-19
  • 2017-10-19 11:59:59
  • 2017-10-19 +1day

Итак, в вашем случае вы можете использовать следующее.

$dt = new \DateTime('now +1 day'); //Tomorrow
$dt = new \DateTime('2016-01-01 +1 day'); //2016-01-02
Дмитрий
источник
3
Отвечаете без объяснения причин? Прочтите Как мне написать хороший ответ?
Shashanth
11
  1. Используйте strtotimeдля преобразования строки в метку времени
  2. Добавьте к нему день (например: добавив 86400 секунд (24 * 60 * 60))

например:

$time = strtotime($myInput);
$newTime = $time + 86400;

Если он добавляет только 1 день, то снова использовать strtotime, вероятно, будет излишним.

Nickf
источник
Итак, мне нужно преобразовать его в TIMESTAMP, а затем обратно в формат DATETIME?
ian
4
Думаю, также следует отметить, что не каждый день длится 24 часа. В большинстве мест в мире переход на летнее время (летнее время) означает, что один день в году составляет всего 23 часа, а другой день - 25 часов.
nickf
UPS. Вы конвертируете дату и время в метку времени, поэтому она основана на UTC. И дни UTC всегда длится 24 часа. При обратном преобразовании с date()учетом местного часового пояса учитывается переход на летнее время.
rabudde
5

Ты можешь использовать

$now = new DateTime();
$date = $now->modify('+1 day')->format('Y-m-d H:i:s');
Омар
источник
1

Предлагаю начать использовать классы Zend_Date из Zend Framework . Знаю, немного оффтоп, но мне так понравится :-)

$date = new Zend_Date();
$date->add('24:00:00', Zend_Date::TIMES);
print $date->get();
Павка
источник
Можете ли вы увидеть мой связанный (quesiton) [ stackoverflow.com/q/61421783/8919244] ?
Moeez
1

Вы можете использовать следующее.

$start_date = date('Y-m-d H:i:s');
$end_date = date("Y-m-d 23:59:59", strtotime('+3 days', strtotime($start_date)));

Вы также можете установить дни как постоянные и использовать их, как показано ниже.

if (!defined('ADD_DAYS')) define('ADD_DAYS','+3 days');
$end_date = date("Y-m-d 23:59:59", strtotime(ADD_DAYS, strtotime($start_date)));
user3216114
источник
0

Использование времени запроса сервера для добавления дней. Работает как положено.

25.08.19 => 27.09.19

$timestamp = $_SERVER['REQUEST_TIME'];
$dateNow = date('d/m/y', $timestamp);
$newDate = date('d/m/y', strtotime('+2 day', $timestamp));

Здесь "+2 дня" можно добавить любое количество дней.

Нирошань
источник
0

Есть более лаконичный и интуитивно понятный способ добавить дни к дате php. Не поймите меня неправильно, эти выражения php великолепны, но вам всегда нужно искать в Google, как с ними обращаться. Я скучаю по автозаполнению для этого.

Вот как мне нравится обращаться с такими случаями:

(new Future(
    new DateTimeFromISO8601String('2014-11-21T06:04:31.321987+00:00'),
    new OneDay()
))
    ->value();

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

В качестве приятного бонуса вам не нужно беспокоиться о форматировании полученного значения, это уже формат ISO8601.

Это библиотека безе, есть несколько примеров здесь .

Вадим Самохин
источник