Daty i godziny w PHP

> Dodaj do ulubionych

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 konstruktora DateTime::__construct() spowoduje powstanie bezsensownej daty, nie 0000-00-00.
  • Funkcja DateTime::getTimestamp() w systemach 32-bitowych reprezentuje daty do 2038 roku. W systemach 64-bitowych wszystko jest w porz─ůdku.

Autor: Alex Cabal

Źródło: http://phpbestpractices.org/

Tłumaczenie: Łukasz Piwko

Tre┼Ť─ç tej strony jest dost─Öpna na zasadach licencji CC BY-SA 3.0

2 komentarze do “Daty i godziny w PHP”

  1. 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.

Mo┼╝liwo┼Ť─ç komentowania zosta┼éa wy┼é─ůczona.