додавання 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);

звичай це не дасть мені поточний час? мені все ще потрібно тримати час, який вводить користувач.
Ян

Так, але я зазначив вам, які значення слід змінити на власний час. Ви можете просто замінити time()на strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}").
RaYell,

це не літній / зимовий час! Будь ласка, використовуйте маніпуляції з датою та часом на літній час
Стівен

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');

Ах, цикл da loop .
Funk Forty Niner

9
Якщо додавати більше одного дня, ви можете використовувати множину або однину і отримати однаковий результат, наприклад: +2 dayабо +2 days(очевидно, +2 daysце семантично правильніше)
timhc22

Які практичні відмінності між цими методами? Перший приклад видається мені найпростішим і найбільш смисловим.
BadHorsie

24

Конструктор DateTime приймає параметр string time. $timeце можуть бути різні речі, він повинен поважати формат дати та часу .

Є кілька допустимих значень як приклади:

  • '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
Відповідати без пояснень? Прочитайте Як написати хорошу відповідь?
Шашант

10
  1. Використовується strtotimeдля перетворення рядка в позначку часу
  2. Додайте до нього день (наприклад: додавши 86400 секунд (24 * 60 * 60))

наприклад:

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

Якщо це лише додавання 1 дня, то використання strtotime знову, ймовірно, надмірне.


Тож мені потрібно перетворити його на TIMESTAMP, а потім повернути у формат DATETIME?
Ян

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();

Ви можете побачити мою пов’язану інформацію (questioniton) [ stackoverflow.com/q/61421783/8919244] ?
Моез,

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)));

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.

Це бібліотека безе, є кілька прикладів тут .

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