Zarządzanie datami w PHP z DateTime

Gdy zamierzamy w PHP przeprowadzać operacje na datach i czasie, możemy skorzystać z wielu funkcji, takich jak date(), strtotime(), mktime() i innych. Znacznie łatwiej jednak wykonać potrzebne działania przy pomocy obiektu DateTime. który jest dostępny w PHP od wersji 5.3. W poniższym tekście postaram się przedstawić podstawowe możliwości tej przydatnej klasy.

Stworzenie nowej daty przy pomocy DateTime jest niezwykle proste. Wystarczy podać odpowiednią wartość jako string tworząc nowy obiekt:

$date_string = '2011-05-30';
$date = new DateTime($date_string);
echo $date->format('r');

Wynik wywołania powyższego kodu może być następujący:

Mon, 30 May 2011 00:00:00 +0200 

Oczywiście możliwe jest także przekazywanie parametru także w innych formatach. W przypadku, gdy utworzymy obiekt z jego pominięciem, ustawiona zostanie bieżąca data i czas. Dzięki metodzie format() możemy w dowolny sposób wyświetlać przetwarzane daty.

Operacje matematyczne na datach

Obiekt DateTime może w znaczącym stopniu uprościć wszelkie działania na datach. Możemy w tym celu wykorzystać metodę modify(), dzięki której w prosty sposób dodamy lub odejmiemy od bazowego czasu podany okres. Na poniższym przykładzie pokazano w jaki sposób można tego dokonać:

$date_string = '2011-05-30 20:33:44';
$date = new DateTime($date_string);
$date->modify('-3 days');
echo $date->format('Y-m-d H:i:s');
$date->modify('+2 month');
echo $date->format('Y-m-d H:i:s');

Wywołanie powyższego kodu powoduje odjęcie od początkowej daty 3 dni, a następnie dodanie do niej 2 miesięcy. Wynik powinien być więc następujący:

2011-05-27 20:33:44
2011-07-27 20:33:44

Innym sposobem jest skorzystanie z metod add() oraz sub(), dzięki którym możemy dodawać oraz odejmować od bazowej daty określony czas. Parametr jest w tym przypadku podawany jako obiekt typu DateInterval. Możemy go utworzyć, stosując odpowiedni parametr przekazywany jako string w określonym formacie. Poniższe wywołanie stworzy okres czasu wynoszący 5 lat, 6 miesięcy, 7 dni, 2 godziny, 3 minuty i 4 sekundy:

$interval = new DateInterval('P5Y6M7DT2H3M4S');

Litery w parametrze oznaczają poszczególne części składowe daty i czasu:
P – data: Y/M/D dla oznaczenia roku, miesiąca oraz dnia
T – czas: H/M/S dla oznaczenia godzin, minut i sekund

Stosując tę możliwość, możemy dokonywać modyfikacji dat w następujący sposób:

$date_string = '2011-05-30 20:33:44';
$date = new DateTime($date_string);
$date->add(new DateInterval('P2DT3H'));
echo $date->format('Y-m-d H:i:s');
$date->sub(new DateInterval('P2Y1M'));
echo $date->format('Y-m-d H:i:s');

W powyższym przykładzie do daty bazowej najpierw dodano 2 dni i 3 godziny, a następnie odjęto 2 lata i jeden miesiąc. Wynik wywołania wygląda następująco:

2011-06-01 23:33:44
2009-05-01 23:33:44 

Porównywanie dat

Kolejnym ułatwieniem, jakie daje nam klasa DateTime, jest bardzo sprawne obliczanie różnic pomiędzy datami oraz ich porównywanie. Wystarczy w tym celu skorzystać z metody diff(). Na poniższym przykładzie przedstawiono sposób, w jaki można obliczyć, ile czasu pozostało do końca roku:

$new_year = new DateTime('01-01-2012 00:00:00');
$now = new DateTime();
$diff = $new_year->diff($now);

echo "Do końca roku pozostało {$diff->days} dni";
echo $diff->format("Do końca roku pozostało: %m miesięcy, %d dni, 
%h godzin, %i minut i %s sekund");

W wyniku wywołania kodu powinny się ukazać dwa teksty, w różny sposób przedstawiające czas:

Do końca roku pozostało 215 dni
Do końca roku pozostało: 7 miesięcy, 1 dni, 1 godzin, 34 minut i 30 sekund 

Daty zdefiniowane przy pomocy obiektu DateTime możemy także porównywać przy pomocy zwykłej instrukcji if. Zostało to przedstawione na poniższym kodzie:

$date1 = new DateTime('2011-01-01');
$date2 = new DateTime('2012-01-01');

if($date1>$date2){
	echo "Pierwsza data jest większa";
}
elseif($date1<$date2){
	echo "Druga data jest większa";
}
else{
	echo "Daty są takie same";
}

Strefy czasowe

Tworząc obiekt DateTime, możemy określić strefę czasową dla jakiej go definiujemy. W przypadku, gdy tego nie określimy, zostanie przyporządkowany do zdefiniowanej w konfiguracji systemu.

Listę dostępnych stref czasowych możemy sprawdzić, korzystając z dostępnej metody:

print_r(DateTimeZone::listIdentifiers()); 

Aby zdefiniować datę dla określonej strefy czasowej, wystarczy dodać do wywołania odpowiedni parametr:

$date = new DateTime('2011-05-30 18:11:22', new DateTimeZone('America/New_York'));

W celu przeliczenia, jaki czas będzie o tej porze w Polsce, wystarczy skorzystać z poniższego wywołania:

$date->setTimeZone(new DateTimeZone('Europe/Warsaw'));
echo $date->format('Y-m-d H:i:s');

Wywołanie powinno zwrócić następny rezultat:

2011-05-31 00:11:22

Podsumowanie

Jak przedstawiono na powyższych przykładach, dzięki obiektowi DateTime możemy zaoszczędzić wiele czasu i linijek kodu. Zachęcam do dokładnego zapoznania się ze szczegółową dokumentacją przedstawionych klas, gdyż pokazane tu zagadnienia obejmują jedynie ich podstawowe możliwości.

Dodaj komentarz