PHP, получить дату завтрашнего дня с даты


89

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

Как это возможно с PHP?

Ответы:


206

Использовать 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


17

Поскольку вы отметили это с помощью , вы можете использовать его с +1 dayмодификатором следующим образом:

$tomorrow_timestamp = strtotime('+1 day', strtotime('2013-01-22'));

Тем не менее, использование DateTime - гораздо лучшее решение .


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 13.08.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.08.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. Есть как минимум две реализации: первая - это анализируемое datetime из строки, а вторая - завтра. Следовательно, можно использовать два класса, и их сочетание приводит к (почти) желаемому результату:

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.Prime дни, которые переключаются на летнее время или
наоборот,

Я подумал об этом, летнее время начинается в два часа и поэтому никогда не должно приводить к другой дате?
Aiyion.Prime

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