2010-05-04 2 views
25

Avere un incubo al momento e solo non può vedere perché non funzionaAggiunta di 30 minuti in volta formattati come H: i in PHP

ho un valore nella forma H: i (ie 10 : 00, 13:30) ecc chiamato $ tempo

Quello che voglio fare è creare due nuovi valori, $ startTime che è di 30 minuti prima di $ tempo e $ endTime che è di 30 minuti dopo $ tempo

I ho provato quanto segue ma proprio non sembra voler lavorare

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

Se mi passano attraverso 10:00 da $ tempo e eco out sia $ startTime e $ endTime ottengo:

$startTime = 00:30 
$startTime = 01:30   
+2

Come è la variabile $ tempo inizializzato? – Patonza

+1

Girato nel buio, ma puoi provare '-30 minuti' senza la s? –

+0

@Pekka non è un problema. Funziona bene, quando non si usa $ time. Deve essere un valore male inizializzato. – Gordon

risposta

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

Mille grazie, non posso credere di non averlo pensato! –

+0

Prego. Sono contento di poterti aiutare. – webbiedave

9

Affinché che lavorare $time deve essere un timestamp. Non è possibile passare in "10:00" o qualcosa come $time = date('H:i', '10:00'); che è ciò che sembra fare, perché poi ottengo anche 0:30 e 1:30 come risultato.

Prova

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

In alternativa, è possibile utilizzare DateTime (sottostante richiede PHP 5.3 però):

$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 

o procedurale, se non ti piace OOP

$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'); 
+2

Vorrei +1 per aver menzionato 'DateTime' se non avessi già fatto +1. –

+0

Grazie per l'headup DateTime, dovremo leggerlo a riguardo ... –

4

Di solito uso una virata leggermente diversa:

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

Dove 1800 secondi = 30 minuti.

1

La soluzione attuale non funziona perché $time è una stringa, deve essere un timestamp Unix. Si può fare questo, invece:

$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
$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); 
0
echo date("Y-m-d H:i:s", strtotime("2016-10-10 15:00:00")+(60*30));//2016-10-10 15:30:00 

o

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

o

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

Giusto per approfondire le risposte precedenti, una funzione per fare questo potrebbe funzionare come questo (cambiando i formati di tempo e intervallo comunque ti piace il M secondo this for function.date, e this for 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;