DateTime – koniec problemów z czasem

php_logo_ok-300x1502Od 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:

Komentarze: 4 do “DateTime – koniec problemów z czasem”

  1. 1 Grzegorz

    Daty można przesuwać też standardową funkcją: strtotime()
    Pozdro.

  2. 2 Marcin Nowak

    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.

  3. 3 City

    Kiedyś obliczałem którego dnia tygodnia była bitwa pod Grunwaldem, ale już nie pamiętam. Tu też by można było to sprawdzić, pzdr. :)

  4. 4 Logos

    Z pewnością wygląda to lepiej niż $time = date(‘Y-m-d’,strtotime(‘+5 days’,time()));

Napisz komentarz



Wersja mobilna