Добавление 30 минут к времени, отформатированное как H: i в PHP

Имея кошмар в данный момент и просто не могу понять, почему он не работает

У меня есть значение в форме H: i (т.е. 10:00, 13:30) и т. Д., Называемое $ time

Я хочу создать два новых значения: $ startTime, которое составляет 30 минут до $ time и $ endTime, которое составляет 30 минут после $ time

Я попробовал следующее, но просто не хочу работать

$startTime = date("H:i",strtotime('-30 minutes',$time)); $endTime = date("H:i",strtotime('+30 minutes',$time)); 

Если я прохожу через 10:00 в качестве $ time и выхожу из $ startTime и $ endTime, я получаю:

 $startTime = 00:30 $startTime = 01:30 

 $time = strtotime('10:00'); $startTime = date("H:i", strtotime('-30 minutes', $time)); $endTime = date("H:i", strtotime('+30 minutes', $time)); 

Для того, чтобы это работало, $time должно быть отметкой времени. Вы не можете перейти в «10:00» или что-то вроде $time = date('H:i', '10:00'); что вы, кажется, делаете, потому что тогда я получаю 0:30 и 1:30 в качестве результатов тоже.

Пытаться

 $time = strtotime('10:00'); 

В качестве альтернативы рассмотрим использование DateTime ( ниже требуется PHP 5.3 ):

 $dt = DateTime::createFromFormat('H:i', '10:00'); // create today 10 o'clock $dt->sub(new DateInterval('PT30M')); // substract 30 minutes echo $dt->format('H:i'); // echo modified time $dt->add(new DateInterval('PT1H')); // add 1 hour echo $dt->format('H:i'); // echo modified time 

или процедурный, если вам не нравится ООП

 $dateTime = date_create_from_format('H:i', '10:00'); date_sub($dateTime, date_interval_create_from_date_string('30 minutes')); echo date_format($dateTime, 'H:i'); date_add($dateTime, date_interval_create_from_date_string('1 hour')); echo date_format($dateTime, 'H:i'); 

Я обычно придерживаюсь немного другого подхода:

 $startTime = date("H:i",time() - 1800); $endTime = date("H:i",time() + 1800); 

Где 1800 секунд = 30 минут.

Ваше текущее решение не работает, потому что $time – это строка – это должна быть отметка времени Unix. Вы можете сделать это вместо этого:

 $unix_time = strtotime('January 1 2010 '.$time); // create a unix timestamp $startTime date( "H:i", strtotime('-30 minutes', $unix_time) ); $endTime date( "H:i", strtotime('+30 minutes', $unix_time) ); 
 $time = 30 * 60; //30 minutes $start_time = date('Ymd h:i:s', time() - $time); $end_time = date('Ymd h:i:s', time() + $time); 
 echo date( "Ymd H:i:s", strtotime("2016-10-10 15:00:00")+(60*30) );//2016-10-10 15:30:00 

или

 echo date( "H:i:s", strtotime("15:00:00")+(60*30) ); // 15:30:00 

или

 echo date( "H:i:s", strtotime(date("H:i:s"))+(60*30) ); // 15:30:00 

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

 // Return adjusted start and end times as an array. function expandTimeByMinutes( $time, $beforeMinutes, $afterMinutes ) { $time = DateTime::createFromFormat( 'H:i', $time ); $time->sub( new DateInterval( 'PT' . ( (integer) $beforeMinutes ) . 'M' ) ); $startTime = $time->format( 'H:i' ); $time->add( new DateInterval( 'PT' . ( (integer) $beforeMinutes + (integer) $afterMinutes ) . 'M' ) ); $endTime = $time->format( 'H:i' ); return [ 'startTime' => $startTime, 'endTime' => $endTime, ]; } $adjustedStartEndTime = expandTimeByMinutes( '10:00', 30, 30 ); echo '<h1>Adjusted Start Time: ' . $adjustedStartEndTime['startTime'] . '</h1>' . PHP_EOL . PHP_EOL; echo '<h1>Adjusted End Time: ' . $adjustedStartEndTime['endTime'] . '</h1>' . PHP_EOL . PHP_EOL;