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:
1 | $date_string = '2011-05-30' ; |
2 | $date = new DateTime( $date_string ); |
3 | 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ć:
1 | $date_string = '2011-05-30 20:33:44' ; |
2 | $date = new DateTime( $date_string ); |
3 | $date ->modify( '-3 days' ); |
4 | echo $date ->format( 'Y-m-d H:i:s' ); |
5 | $date ->modify( '+2 month' ); |
6 | 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:
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:
1 | $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:
1 | $date_string = '2011-05-30 20:33:44' ; |
2 | $date = new DateTime( $date_string ); |
3 | $date ->add( new DateInterval( 'P2DT3H' )); |
4 | echo $date ->format( 'Y-m-d H:i:s' ); |
5 | $date ->sub( new DateInterval( 'P2Y1M' )); |
6 | 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:
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:
1 | $new_year = new DateTime( '01-01-2012 00:00:00' ); |
3 | $diff = $new_year ->diff( $now ); |
5 | echo "Do końca roku pozostało {$diff->days} dni" ; |
6 | echo $diff ->format("Do końca roku pozostało: %m miesięcy, %d dni, |
7 | %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:
1 | $date1 = new DateTime( '2011-01-01' ); |
2 | $date2 = new DateTime( '2012-01-01' ); |
5 | echo "Pierwsza data jest większa" ; |
8 | echo "Druga data jest większa" ; |
11 | 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:
1 | 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:
1 | $date ->setTimeZone( new DateTimeZone( 'Europe/Warsaw' )); |
2 | echo $date ->format( 'Y-m-d H:i:s' ); |
Wywołanie powinno zwrócić następny rezultat:
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.