2013-09-26 10 views
8

Chcę dodać czas do istniejącej daty. Mam 2 zmienne łańcuchowe:Jaki jest najlepszy sposób dodawania przedziału czasu w PHP?

$date  = "2013-01-05 10:55:15"; 
$interval =   "50:25:10"; 

Chcę obliczyć datę końcową "2013-01-07 13:20:25". Godziny w czasie mogą być większe niż 23, co oznacza, że ​​ten przedział może być większy niż cały dzień.

Jaki jest najlepszy sposób na zrobienie tego?

+2

http://www.php.net/manual/en/datetime.add.php – CBroe

Odpowiedz

7

Korzystając DateTime API:

$date = new DateTime("2013-01-05 10:55:15"); 
$date->add(new DateInterval("PT50H25M10S")); 

potem można przekonwertować go z powrotem do łańcucha z tym samym formacie dat użyłby z date() funkcji, jeśli chcesz:

$string = $date->format("Y-m-d H:i:s"); 

aby uzyskać więcej informacji na temat DateInterval definicja, odwiedź tę stronę:

DateInterval

Format zaczyna się na literę P, do "okresu". Każdy okres trwania okresu jest reprezentowany przez wartość całkowitą, po której następuje oznaczenie okresu . Jeśli czas trwania zawiera elementy czasu, ta część specyfikacja jest poprzedzona literą T.

Oto kilka prostych przykładów. Dwa dni to P2D. Dwie sekundy to PT2S. Sześć lat i pięć minut to P6YT5M.

więc w tym przypadku PT50H25M10S elementy 50 godzin, 25 minut i 10 sekund

DateInterval Należy zauważyć, że jest dostępna tylko od PHP 5.3, jeśli trzeba użyć mniejszą wersję, można użyć coś takiego:

$time = strtotime("2013-01-05 10:55:15"); 
$time += 55*60*60 + 25*60 + 10; 
$newDate = date("Y-m-d H:i:s"); 
5

To jest trochę skomplikowane.

Normalnie co byś zrobił, gdyby tu był okresem statyczny, czy też jeden typ okresu, jest coś wzdłuż linii:

$date = "2013-01-05 10:55:15"; 
$time = new DateTime($date); 
$time->add(new DateInterval('PT5M')); 

byłoby to dodać 5 minut do datetime. Jednak wątpię, żebyś mógł przejść cały interwał. Więc prawdopodobnie będziesz musiał podzielić interwał przez:, a następnie dodać każdą część przedziału (zakładam, że jest dynamiczna?) Do daty osobno. Więc pierwsze godziny, następnie minut, następnie sekund

Więcej na ten temat można znaleźć tutaj: http://www.php.net/manual/en/datetime.add.php

3

Można najpierw eksplodować interwał, a następnie dostać godziny, minuty, sekundy, a następnie użyć DateTime na add() dodać odstęp, tak:

$interval = '50:25:10'; 
$datestring = '2013-01-05 10:55:15';  
list($hours, $minutes, $seconds) = explode(':', $interval); 

$date = new DateTime($datestring);  
$date->add(new DateInterval('PT'.$hours.'H'.$minutes.'M'.$seconds.'S')); 
echo $date->format('Y-m-d H:i:s'); 

Demo!

1

W przypadku gdy ktoś potrzebuje na podstawie odpowiedzi powyżej, zrobiłem moją funkcję tak:

public function addTime($date, $time) { 
    $atime = explode(":", $time); 
    $_date = date_create_from_format("Y-m-d H:i:s", $date); 
    $_date->add(new DateInterval("PT" . intval($atime[0])."H".intval($atime[1])."M".intval($atime[2])."S")); 
    return $_date->format("Y-m-d H:i:s"); 
} 

mam nadzieję, że komuś pomaga

Powiązane problemy