Daty i godziny w PHP

21 marca 2016
1 gwiadka2 gwiazdki3 gwiazdki4 gwiazdki5 gwiazdek

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 dostępna jest na zasadach licencji CC BY-SA 3.0

Zobacz również:

2 komentarze

  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?

    Odpowiedz
    • Wg mnie to jest w porządku, bo chodzi tylko o ten komputer, na którym uruchomiono skrypt. Poza tym serwer to też komputer.

      Odpowiedz

Dyskusja

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *