web-dev-qa-db-fra.com

Ajout de 30 minutes à une heure au format H: i dans PHP

Avoir un cauchemar en ce moment et je ne vois pas pourquoi ça ne marche pas

J'ai une valeur sous la forme H: i (c'est-à-dire 10h00, 13h30), etc. appelée $ time

Ce que je veux faire, c'est créer deux nouvelles valeurs: $ startTime, 30 minutes avant $ time et $ endTime, 30 minutes après $ time

J'ai essayé ce qui suit, mais je ne semble pas vouloir travailler.

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

Si je passe à 10:00 en tant que $ time et que je répète en écho $ startTime et $ endTime, je reçois:

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

Pour que cela fonctionne, $time doit être un horodatage. Vous ne pouvez pas entrer "10:00" ou quelque chose comme $time = date('H:i', '10:00');, ce que vous semblez faire, car j'obtiens 0:30 et 1:30 comme résultat également. 

Essayer

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

En guise d'alternative, envisagez d'utiliser DateTime ( le texte ci-dessous nécessite PHP 5.3 si ):

$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

ou procédurale si vous n'aimez pas la POO

$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');
9
Gordon

Je prends généralement une tactique légèrement différente:

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

Où 1800 secondes = 30 minutes.

4
Hans

Votre solution actuelle ne fonctionne pas car $time est une chaîne - il doit s'agir d'un horodatage Unix. Vous pouvez le faire à la place:

$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) );
1
DisgruntledGoat
$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
donny

Juste pour développer les réponses précédentes, une fonction permettant de faire ceci pourrait fonctionner comme ceci (changer les formats d'heure et d'intervalle comme vous les aimez selon this pour function.date , et this pour 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
FirstFraktal
echo date( "Y-m-d H:i:s", strtotime("2016-10-10 15:00:00")+(60*30) );//2016-10-10 15:30:00

ou

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

ou

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