DateTime – koniec problemów z czasem
- Mateusz Żeromski | 2009-10-12 | Ciekawostki Php
Od czasu do czasu trzeba zrobić operacje na datach, jakieś przesunięcia, pętle, czy też okresy. Php oczywiście podaje nam ciekawe rozwiązania problemów takie jak: date, mktime, strftime, gmmktime, time itp itd. Nie wiem jak dla Was ale korzystanie z tego “czasowego śmietnika” powodowała u mnie negatywne emocje. Dlatego korzystałem z Zend_Date. Lecz według mnie ta biblioteka to przerost formy nad treścią jeżeli potrzebujemy tylko wyznaczyć przedziały czasu (tygodnie miesiące) w zadanym okresie. Dlatego w php jest coś takiego jak DateTime.
Teoria
DateTime jest to klasa do obsługi daty. Tworzenia, zmieniania i wyświetlania w sposób łatwiejszy i przyjemniejszy niż w przypadku date, time,mktime itp itd. Największą przewagę widać w przypadku operowania na datach, a w szczególności gdy wykorzystamy metodę “modify”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $date = new DateTime("2006-01-01"); $date -> modify("+1 sec"); echo $date->format("Y-m-d H:i:s")."\n"; $date->modify("+1 minute"); echo $date->format("Y-m-d H:i:s")."\n"; $date->modify("+1 hour"); echo $date->format("Y-m-d H:i:s")."\n"; $date->modify("+1 day"); echo $date->format("Y-m-d H:i:s")."\n"; $date->modify("+1 week"); echo $date->format("Y-m-d H:i:s")."\n"; $date->modify("+1 month"); echo $date->format("Y-m-d H:i:s")."\n"; $date->modify("+1 year"); echo $date->format("Y-m-d H:i:s")."\n"; |
Jako wynik otrzymujemy
2006-01-01 00:00:01
2006-01-01 00:01:01
2006-01-01 01:01:01
2006-01-02 01:01:01
2006-01-09 01:01:01
2006-02-09 01:01:01
2007-02-09 01:01:01
Praktyka
Aby podać praktyczne zastosowanie wypiszę tygodnie z dat pomiędzy 2008-01-01 do 2008-03-01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | //dane ograniczające $start = '2008-01-01'; $end = '2008-03-01'; //oblicz pierwszy dzien tygodnia (1 sty 2008 to wtorek, także zaczniemy od 31 gru 2007) $date = new DateTime($start); $numOfDay = $date -> format('N'); $i = $numOfDay-1; $date -> modify('- '.$i.' day'); //tworzymy tablicę obiektów do wyświetlenai - taki kontroller $dates = array(); $dates[] = clone $date; while($date -> format('Y-m-d') <= $end){ $date -> modify('+1 week'); $dates[] = clone $date; } //wyswietlamy wynik w formacie //numer tygodnia w roku - data poczatkowa/data koncowa foreach($dates as $date){ echo $date -> format('W' )."\t"; echo $date -> format('Y-m-d' ).""; $date -> modify('+ 6 day'); echo '/'; echo $date -> format('Y-m-d' )."\n"; } |
Jako wynik zobaczymy
01 2007-12-31/2008-01-06
02 2008-01-07/2008-01-13
03 2008-01-14/2008-01-20
04 2008-01-21/2008-01-27
05 2008-01-28/2008-02-03
06 2008-02-04/2008-02-10
07 2008-02-11/2008-02-17
08 2008-02-18/2008-02-24
09 2008-02-25/2008-03-02
10 2008-03-03/2008-03-09
Podsumowanie
Jak widać na praktycznym przykładzie kodu jest bardzo mało i jest on o wiele bardziej przejrzysty niż w przypadku korzystania mktime, date itp, dlatego warto korzystać z DateTime a co za tym idzie – uczmy się nowych rzeczy :)
Tagi: php
1 Grzegorz 2009-11-24 11:42:24
Daty można przesuwać też standardową funkcją: strtotime()
Pozdro.
2 Marcin Nowak 2010-01-18 13:07:32
Oblicz proszę ilość dni od Bitwy pod Grunwaldem =)
Z tego co pamiętam Zend_Date chyba dawał radę, ale nie jestem pewien, czy nie był to jakiś sen.