Добавление 30 минут ко времени в формате H: i в PHP - PullRequest
37 голосов
/ 04 мая 2010

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

У меня есть значение в форме 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        

Ответы [ 7 ]

84 голосов
/ 04 мая 2010
$time = strtotime('10:00');
$startTime = date("H:i", strtotime('-30 minutes', $time));
$endTime = date("H:i", strtotime('+30 minutes', $time));
9 голосов
/ 04 мая 2010

Для того, чтобы это работало, $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');
4 голосов
/ 04 мая 2010

Я обычно беру немного другую тактику:

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

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

1 голос
/ 31 октября 2014
$time = 30 * 60; //30 minutes
$start_time = date('Y-m-d h:i:s', time() - $time);
$end_time = date('Y-m-d h:i:s', time() + $time);
1 голос
/ 04 мая 2010

Ваше текущее решение не работает, потому что $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) );
0 голосов
/ 04 апреля 2017

Просто, чтобы расширить предыдущие ответы, функция, которая делает это, может работать следующим образом (изменяя форматы времени и интервала, как вам нравится в соответствии с это для 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;
0 голосов
/ 03 января 2017
echo date( "Y-m-d 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
...