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.