PHP, Отримати завтра дати з дати


89

У мене є дата PHP у формі, 2013-01-22і я хочу отримати дату завтра в тому ж форматі, наприклад, наприклад 2013-01-23.

Як це можливо за допомогою PHP?

Відповіді:


205

Використовуйте DateTime

$datetime = new DateTime('tomorrow');
echo $datetime->format('Y-m-d H:i:s');

Або:

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

Або:

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

Або в PHP 5.4+:

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

1
Тут використовується поточний, мені потрібно передати задану дату.
Джастін

Другий спосіб, мабуть, найкращий.
nickb

73
 $tomorrow = date("Y-m-d", strtotime('tomorrow'));

або

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

Довідкове посилання: STRTOTIME ()


1
Я використав цю, і з усіх відповідей - це найкоротша та найпростіша версія, дякую!
Бомбелман


14
<? php 

//1 Day = 24*60*60 = 86400

echo date("d-m-Y", time()+86400); 

?>

17
Зверніть увагу, що це не вдасться в крайніх випадках (перехід на літній час).
JJJ

Ця відповідь неправильна. У мене cronjob використовує це в циклі, і система загинула.
jewelnguyen8


3

Використання DateTime:

Щоб отримати завтра завтра:

$d = new DateTime('+1day');
$tomorrow = $d->format('d/m/Y h.i.s');
echo $tomorrow;

Результати: 28.06.2017 08.13.20

Щоб отримати завтра від дати:

$d = new DateTime('2017/06/10 08.16.35 +1day')
$tomorrow = $d->format('d/m/Y h.i.s');
echo $tomorrow;

Результати: 06.11.2017 16.16.35

Сподіваюся, це допоможе!


1
/**
 * get tomorrow's date in the format requested, default to Y-m-d for MySQL (e.g. 2013-01-04)
 *
 * @param string
 *
 * @return string
 */
public static function getTomorrowsDate($format = 'Y-m-d')
{
    $date = new DateTime();
    $date->add(DateInterval::createFromDateString('tomorrow'));

    return $date->format($format);
}

1

Як не дивно це може здатися, це працює чудово: date_create( '2016-02-01 + 1 day' );

echo date_create( $your_date . ' + 1 day' )->format( 'Y-m-d' );

Повинен це зробити


0

По-перше, придумати правильні абстракції - це завжди ключ. ключ до читабельності, ремонтопридатності та розширюваності.

Тут цілком очевидним кандидатом є ISO8601DateTime. Є щонайменше дві реалізації: перша - це проаналізований час із рядка, а друга - завтра. Отже, можна використовувати два класи, і їх поєднання призводить до (майже) бажаного результату:

new Tomorrow(new FromISO8601('2013-01-22'));

Обидва об’єкти є датою ISO8601, тому їх текстове представлення не зовсім те, що вам потрібно. Тож останній штрих - змусити їх прийняти форму дати:

new Date(
    new Tomorrow(
        new FromISO8601('2013-01-22')
    )
);

Оскільки вам потрібно текстове представлення, а не просто об'єкт, ви викликаєте файл value() метод.

Детальніше про цей підхід погляньте на цю публікацію .


-1

ось робоча функція

function plus_one_day($date){
 $date2 = formatDate4db($date);
 $date1 = str_replace('-', '/', $date2);
 $tomorrow = date('Y-m-d',strtotime($date1 . "+1 days"));
 return $tomorrow; }

що робить функція formatDate4db? Навіщо замінювати риски на похилі риски в рядку?
braindigitalis

Функція formatDate4db передає дату, і вона робить такий формат, як формат бази даних mysql та функція str_replace, я маю формат дати 2019/12/10 і замінюю на -
Мухаммад Авайс Цуліфкяр

-4
$date = '2013-01-22';
$time = strtotime($date) + 86400;
echo date('Y-m-d', $time);

Де 86400 - це кількість секунд на день.


11
Ні, один день не завжди має 86400 секунд.
nickb

Я не розумію проблеми. Будь ласка, поясніть @nickb
Aiyion.Prime

@ Aiyion.В первинні дні, що переходять на літній час або з нього, немає 86400 секунд
dumazy

Я подумав про те, що літній час починається о другій годині, і тому ніколи не повинен призводити до іншої дати?
Aiyion. Прем'єр-міністр,

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