Добавление минут к дате в PHP

99

Я действительно застрял с добавлением X минут в datetime, после большого количества google'ing и ручного чтения PHP я, похоже, ничего не добился.

У меня есть формат даты и времени:

2011-11-17 05:05: year-month-day hour:minute

Минуты для добавления будут просто числом от 0 до 59.

Я хотел бы, чтобы результат был таким же, как формат ввода с добавленными минутами.

Может ли кто-нибудь дать мне пример рабочего кода, поскольку мои попытки, похоже, ни к чему не приводят?

Люк Б
источник

Ответы:

178
$minutes_to_add = 5;

$time = new DateTime('2011-11-17 05:05');
$time->add(new DateInterval('PT' . $minutes_to_add . 'M'));

$stamp = $time->format('Y-m-d H:i');

Стандарт ISO 8601 для продолжительности - это строка в форме, в P{y}Y{m1}M{d}DT{h}H{m2}M{s}Sкоторой {*}части заменяются числовым значением, указывающим, какова длительность.

Например, P1Y2DT5Sозначает 1 год, 2 дня и 5 секунд.

В приведенном выше примере мы предоставляем PT5M(или 5 минут) DateIntervalконструктору.

Тим Купер
источник
С датой: 2011-11-18 00:00, если я добавлю 5 минут, в результате я получу 2012-04-18 00:00. `$ time = new DateTime ($ _ REQUEST ['начало']); $ time-> add (новый DateInterval ('P'. $ duration. 'M')); $ endTime = $ time-> формат ('Ymd H: i'); echo $ endTime; `Приложения для форматирования, похоже, я тоже не могу это решить сегодня ^ _ ^
Люк Б.
2
Чем DateTime лучше, чем strtotime?
bozdoz
11
Что означает «PT»?
NicholasJohn
1
@bozdoz Вопрос не в том, какой метод «лучше». strtotimeсоздает временную метку Unix, integerкоторая полезна, например, если вы сортируете даты в php. DateTimeКласс предоставляет опции для объекта и процедурный стиль операций. Он более читабелен, а также имеет лучшую поддержку для обработки различий между разными часовыми поясами; например, если у вас есть проект, который выводит даты для множества разных часовых поясов, полученных из одного и того же экземпляра данных.
DrewT
2
@ NicholasJohn16 php.net/manual/en/dateinterval.construct.php >> Формат начинается с буквы P, обозначающей «точку». Каждый период продолжительности представлен целым числом, за которым следует указатель периода. Если продолжительность содержит элементы времени, этой части спецификации предшествует буква T.
vee
114

Класс PHP DateTime имеет полезный метод изменения, который принимает простой для понимания текст.

$dateTime = new DateTime('2011-11-17 05:05');
$dateTime->modify('+5 minutes');

Вы также можете использовать интерполяцию или конкатенацию строк для ее параметризации:

$dateTime = new DateTime('2011-11-17 05:05');
$minutesToAdd = 5;
$dateTime->modify("+{$minutesToAdd} minutes");
Даниэль
источник
10
Самый короткий и милый!
1
Оба основных ответа великолепны и работают нормально, но я предпочитаю этот. Просто кажется более простым и интуитивно понятным.
HartleySan,
38
$newtimestamp = strtotime('2011-11-17 05:05 + 16 minute');
echo date('Y-m-d H:i:s', $newtimestamp);

результат

2011-11-17 05:21:00

Живая демонстрация here

Если вы еще не знакомы с ним strtotime, вам лучше php.netоткрыть для себя его огромную силу :-)

Немоден
источник
1
Самый понимающий
Naveen DA
19

Вы можете легко сделать это с помощью собственных функций:

strtotime('+59 minutes', strtotime('2011-11-17 05:05'));

Я бы порекомендовал метод класса DateTime, только что опубликованный Тимом.

Брэд
источник
7

Я думал, что это поможет некоторым при работе с часовыми поясами. Мое модифицированное решение основано на решении @Tim Cooper, правильный ответ выше.

$minutes_to_add = 10;
$time = new DateTime();
**$time->setTimezone(new DateTimeZone('America/Toronto'));**
$time->add(new DateInterval('PT' . $minutes_to_add . 'M'));
$timestamp = $time->format("Y/m/d G:i:s");

Жирная линия, строка 3, - дополнение. Я надеюсь, что это тоже поможет некоторым людям.

акарито
источник
4

Немного запоздалый ответ, но я бы использовал следующий метод:

// Create a new \DateTime instance
$date = DateTime::createFromFormat('Y-m-d H:i:s', '2015-10-26 10:00:00');

// Modify the date
$date->modify('+5 minutes');

// Output
echo $date->format('Y-m-d H:i:s');

Или в PHP> = 5.4

echo (DateTime::createFromFormat('Y-m-d H:i:s', '2015-10-26 10:00:00'))->modify('+5 minutes')->format('Y-m-d H:i:s')
Питер
источник
4

Я не знаю, почему подход, предложенный в качестве решения, у меня не сработал. Итак, я публикую здесь то, что сработало для меня, в надежде, что это может помочь кому угодно:

$startTime = date("Y-m-d H:i:s");

//display the starting time
echo '> '.$startTime . "<br>";

//adding 2 minutes
$convertedTime = date('Y-m-d H:i:s', strtotime('+2 minutes', strtotime($startTime)));

//display the converted time
echo '> '.$convertedTime;
пользователь3361395
источник
3

Если вы хотите указать переменную, содержащую минуты.

Тогда я думаю, что это отличный способ добиться этого.

$minutes = 10;
$maxAge = new DateTime('2011-11-17 05:05');
$maxAge->modify("+{$minutes} minutes");
Бодинн Грев
источник
2

Использовать strtotime("+5 minute", $date);


Пример:

$date = "2017-06-16 08:40:00";
$date = strtotime($date);
$date = strtotime("+5 minute", $date);
echo date('Y-m-d H:i:s', $date);
Смерть
источник
1

Как отметили Брэд и Немоден в своих ответах выше, strtotime () - отличная функция. Лично я считаю стандартный объект DateTime слишком сложным для многих случаев использования. Я просто хотел, например, добавить 5 минут к текущему времени.

Я написал функцию, которая возвращает дату в виде строки с некоторыми необязательными параметрами:
1.) time: String | пример: "+5 минут" (по умолчанию = текущее время)
2.) формат: String | например: "Ymd H: i: s" (по умолчанию = "Ymd H: i: s O")

Очевидно, что это не полнофункциональный метод. Просто быстрая и простая функция для изменения / форматирования текущей даты.

function get_date($time=null, $format='Y-m-d H:i:s O')
{
    if(empty($time))return date($format);
    return date($format, strtotime($time));
}

// Example #1: Return current date in default format
$date = get_date(); 

// Example #2: Add 5 minutes to the current date
$date = get_date("+5 minutes"); 

// Example #3: Subtract 30 days from the current date & format as 'Y-m-d H:i:s'
$date = get_date("-30 days", "Y-m-d H:i:s"); 
Роберт Швиндаман
источник
0

Еще один пример функции для этого: (изменение форматов времени и интервалов, как бы они вам ни нравились, в соответствии с этим для function.date , а это для DateInterval ):

(Я также написал альтернативную форму функции ниже .)

// Return adjusted time.

function addMinutesToTime( $dateTime, $plusMinutes ) {

    $dateTime = DateTime::createFromFormat( 'Y-m-d H:i', $dateTime );
    $dateTime->add( new DateInterval( 'PT' . ( (integer) $plusMinutes ) . 'M' ) );
    $newTime = $dateTime->format( 'Y-m-d H:i' );

    return $newTime;
}

$adjustedTime = addMinutesToTime( '2011-11-17 05:05', 59 );

echo '<h1>Adjusted Time: ' . $adjustedTime . '</h1>' . PHP_EOL . PHP_EOL;
ПервыйФрактал
источник
0

однострочный формат даты и времени MySQL

$mysql_date_time = (new DateTime())->modify('+15 minutes')->format("Y-m-d H:i:s");
Sjaak Wish
источник
-1

Без использования переменной:

 $yourDate->modify("15 minutes");
 echo $yourDate->format( "Y-m-d H:i");

С использованием переменной:

 $interval= 15;
 $yourDate->modify("+{$interval } minutes");  
 echo $yourDate->format( "Y-m-d H:i");
Ваджид Хан
источник
Что есть $yourDate? Что этот ответ добавляет к аналогичным ответам, опубликованным несколько лет назад?
Нет
Уважаемый @ J.Money $ yourDate означает имя переменной $, и, возможно, мой ответ будет полезен кому-то через 100 лет. Неважно, когда мы должны ответить, пока вопрос не будет закрыт. Надеюсь, вы разберетесь и снимете негативную маркировку.
Wajid хан