Do pracy z datami i godzinami należy używać klasy DateTime.
W dawnych mrocznych czasach programiści PHP musieli do pracy z datami i godzinami wykorzystywać dziwaczną mieszankę funkcji date()
, gmdate()
, date_timezone_set()
, strtotime()
itd. Niestety w internecie wciąż jest mnóstwo poradników, w których autorzy polecają posługiwanie się tymi przestarzałymi i trudnymi w obsłudze funkcjami.
Na szczęście w nowych wersjach PHP dostępna jest wygodna w użyciu klasa DateTime
. Obejmuje ona całą funkcjonalność starych funkcji i wiele więcej, a wszystko to w formie wygodnego w obsłudze pakietu będącego klasą. Dodatkowo klasa ta bardzo ułatwia dokonywanie konwersji stref czasowych. Dlatego jeśli musisz utworzyć, porównać, zmienić lub wyświetlić daty w PHP, użyj do tego celu klasy DateTime
.
Przykład
<?php
// Tworzymy nową datę UTC. Zawsze używaj UTC, chyba że dokładnie wiesz dlaczego potrzebujesz czegoś innego!
$date = new DateTime('2011-05-04 05:00:00', new DateTimeZone('UTC'));
// Dodajemy dziesięć dni do początkowej daty.
$date->add(new DateInterval('P10D'));
echo($date->format('Y-m-d h:i:s')); // 2011-05-14 05:00:00
// Niestety klasa nie obsługuje strefy czasowej Śródziemia.
// Konwertujemy datę UTC na PST (lub PDT, to zależy).
$date->setTimezone(new DateTimeZone('America/Los_Angeles'));
// U ciebie ten kod może zwrócić inny wynik o godzinę ze względu na zmianę czasu na zimowy lub letni.
echo($date->format('Y-m-d h:i:s')); // 2011-05-13 10:00:00
$later = new DateTime('2012-05-20', new DateTimeZone('UTC'));
// porównanie dwóch dat
if($date < $later)
echo('Tak, daty można porównywać za pomocą tych prostych operatorów!');
// obliczanie różnicy między dwiema datami
$difference = $date->diff($later);
echo('Druga data różni się od pierwszej o ' . $difference->days . ' dni.');
?>
Pułapki
- Jeśli nie określisz strefy czasowej, konstruktor
DateTime::__construct()
ustawi strefę czasową wyniku na strefę komputera, na którym uruchomiono skrypt. Efektem tego w późniejszym czasie może być wiele efektownych błędów. Nowe daty zawsze twórz w strefie UTC, chyba że dokładnie wiesz dlaczego musisz to zmienić. - Jeśli w konstruktorze
DateTime::__construct()
użyjesz uniksowego znacznika czasu, to strefa czasowa zostanie ustawiona na UTC bez względu na wartość drugiego argumentu. - Przekazanie zerowej daty (np. 0000-00-00, taką wartość często tworzy baza danych MySQL domyślnie w kolumnie
DateTime
) do konstruktoraDateTime::__construct()
spowoduje powstanie bezsensownej daty, nie0000-00-00
. - Funkcja
DateTime::getTimestamp()
w systemach 32-bitowych reprezentuje daty do 2038 roku. W systemach 64-bitowych wszystko jest w porządku.
Nie używałbym określenia „strefa czasowa komputera”, bo jest prawdziwe tylko w tej mniejszości przypadków, kiedy używamy PHP bez serwera. Może należałoby powiedzieć „strefa czasowa oprogramowania obsługującego PHP”? Strefa czasowa komputera to w sumie również sprawa oprogramowania, chodzi przecież o ustawienia systemu operacyjnego. Co sądzisz?
Wg mnie to jest w porządku, bo chodzi tylko o ten komputer, na którym uruchomiono skrypt. Poza tym serwer to też komputer.