Добавление минут к дате в 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;

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

-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 хан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.