Data i czas w PHP

Written by Sebastian Potasiak

Topics: PHP, Programowanie

Wiele osób boryka się z problemem przechowywania daty w PHP. Najpierw zapisują ją w określonym formacie, a później pojawia się problem zmiany tegoż formatu lub dodania np. godziny, czy minut.

Jest na to pewien bardzo dobry sposób, który Wam tutaj przedstawię. Pokażę także w jaki sposób możecie skonwertować datę na dowolny format.

Czas POSIX

Czas UNIX-owy, czyli Czas POSIX, to liczba sekund, które minęły od godziny “zero” czasu UTC, 1 stycznia 1970 roku. Na podstawie liczby sekund można ustalić jaki mamy rok, miesiąc, dzień, godzinę, minutę i sekundę.

W PHP istnieje funkcja do generowania aktualnego czasu POSIX:

1
$unix_time = time();

To właśnie czas UNIX-owy najlepiej jest wykorzystywać do przechowywania daty. Jeśli jeszcze nie uruchomiłeś swojej strony – zmień skrypty, tak, aby w bazie danych przechowywany był czas POSIX.

Możesz także w zapytaniach SQL użyć specjalnej funkcji automatycznie wpisującej czas UNIX-owy:

1
SELECT UNIX_TIMESTAMP();

Takie zapytanie zwróci to samo co funkcja time() w PHP.

Wyświetlanie daty

Zapewne do tej pory wyświetlałeś datę za pomocą funkcji date() w mniej-więcej taki sposób:

1
print date('d-m-Y');

Co wyświetlało ładnie datę, np.: 24-06-2009. Oczywiście można pracować na tak sformatowanej dacie, ale uważam, że czas POSIX umożliwia nam sprecyzowanie czasu, a data nadal jest wyświetlana tą samą funkcją, tylko potrzebuje jeszcze jednego parametru:

1
2
$unix_time = time();
print date('d-m-Y H:i', $unix_time);

Teraz można dowolnie modyfikować pierwszy parametr.

W języku SQL także istnieje sposób na zmianę czasu UNIX-owego na “normalny”:

1
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());

Oczywiście zamiast UNIX_TIMESTAMP() możemy użyć dowolnego czasu zachowanego w bazie danych.

Konwertowanie daty do czasu POSIX

Istnieje możliwość zmiany daty wygenerowanej standardowo funkcją date() na czas UNIX-owy. Służy do tego funkcja:

1
2
3
4
5
6
7
$godzina = 12;
$minuta = 0;
$sekunda = 0;
$miesiac = 6;
$dzien = 24;
$rok = 2009;
$unix_time = mktime($godzina, $minuta, $sekunda, $miesiac, $dzien, $rok);

W ten sposób funkcja generuje czas UNIX-owy. Można użyć także funkcji strtotime(), która automatycznie zmieni nam zapisaną datę na czas UNIX-owy:

1
2
$date = date('Y-m-d H:i:s');
$time = strtotime($date);

Podsumowanie

To chyba wszystko na temat czasu UNIX-owego. Poniżej przekazuję dodatkowe linki do stron, z których możecie dowiedzieć się jeszcze więcej na temat czasu i dat w PHP i SQL.


Strony, które powinieneś odwiedzić

Data i czas na MySQL.com
Data i czas na PHP.net
Czas POSIX na Wikipedii

Podziel się z innymi
  • Digg
  • del.icio.us
  • Facebook
  • email
  • Wykop
  • Twitter

10 komentarzy Comments For This Post I'd Love to Hear Yours!

  1. Athlan mówi:

    Jaja sobie robisz… WON z planety!

  2. krzysiek mówi:

    W ostatnim przykładzie nie łatwiej było użyć funkcji strtotime?

  3. wsl mówi:

    A o strtotime() to Pan nigdy nie słyszał?

  4. lato_p mówi:

    Jeśli data czy godzina jest przechowywana w odpowiednim typie pola w bazie (czyli nie jako tekst, a jako date, datetime lub timestamp) to oczywiście, że baza wspiera ich modyfikowanie w wygodny sposób. Nie ma, że nie da rady. Oczywiście że się da:
    UPDATE t SET date = date + 1 HOUR;
    Zero problemu. Choćby w MySQL
    http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html
    albo w Postgresie
    http://www.postgresql.org/docs/8.0/static/functions-datetime.html

    A zabawa z explode i datą? Posłuchaj, niedawno widziałem taką fajną funkcję, mówię Ci, piękna, wszystko potrafi, możesz do niej gadać w różnych formatach i wszystko zrozumie… A, jak się nazywa? strtotime().
    http://php.net/strtotime


    Mam nadzieję, że ten komentarz przyczyni się do Twojego pozytywnego rozwijania się w temacie programowania w PHP i SQL oraz, że przyda Ci się w dalszej przygodzie z programowaniem.

  5. sf mówi:

    Zabrakło trochę takich funkcji jak strtotime gdzie możemy w bardzo prosty sposób zamieniać/zwiększać/zmniejszać datę i godzinę np.

    $time = ‘07:00′;
    echo date(‘H:i:s’, strtotime($time . ‘ +30 minutes’));

  6. Rasgan mówi:

    Bardzo pomocny wpis wyjaśniający w końcu w jasny i klarowny sposób dlaczego tak a nie inaczej. Dziękuję.

  7. piotrooo89 mówi:

    a ja to raczej jestem za tym aby np do bazy zapisywać datę-czas w formacie TIMESTAMP. fajnie można na niej operować. można np obliczać jakiś interwał poprzez rzutowanie typów. i również mogę dodawać dni godziny sekundy etc a wszystko za pomocą wspomnianego prze zemnie interwału. opisuje tu oczywiście funkcjonalność Postgres’a nie wiem jak sprawa rzutowań, interwałów wygląda w MySQL, ale ostatnio słyszałem że MySQL jest upośledzony więc może mieć problem z tego typu rzeczami :) choć sprawa wydaje się do zbadania. no i rzecz jasna jestem zwolennikiem obliczania jakiś dat właśnie po stronie serwera SQL.

  8. Theq mówi:

    Fani strtotime powinni wspomnieć, ze nie zawsze ona zwróci to co byśmy chcieli np.

    echo ‘miesiąc po marcu to ‘.date(‘M’, strtotime(‘31-03-2009 +1 month’))

  9. cojack mówi:

    A ja jeszcze chciałbym dodać dla wszystkich fanatyków timestamp w db że jesteście upośledzeni, pseudo programistami, którzy nie potrafią, czytaj nie umieją operować na liczbach. Dlaczego? A otóż dlatego że wygodniej jest operować im na datach, CO JEST ABSURDEM! I chciałbym bardzo podziękować Sebastianowi za ten wpis, chociaż czuje niedosyt, nie pokazałeś jakim wielkim plusem jest używanie linux epoch w db zamiast dat w timestamp. Pomyślcie sami, co jest szybsze? Sortowanie po INT czy sortowanie po dacie? hmmm no nawet w gimnazjum Wam powiedzą że po int.

    Także środkowym palcem pozdrawiam upośledzonych, dzięki Wam mam pracę.

    Tu się zaczynają schody, pokażcie poziom.

  10. Arek mówi:

    cojack, wypowiadasz się o czymś, o czym masz niewielkie pojęcie i w dodatku kolejny raz nazywasz ludzi upośledzonymi, chociaż nie masz ku temu podstaw. Sortowanie po int i sortowanie po dacie będzie podobnie szybkie, ponieważ MySQL wewnętrznie przechowuje daty (zapisane w polach TIMESTAMP, DATETIME lub DATE) jako liczby. Źródło: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html (wyszukaj “Storage Requirements for Date and Time Types”).

    A dzięki temu, że zapiszesz datę w polu TIMESTAMP, DATETIME lub DATE, zyskujesz możliwość używania całej gamy funkcji do wygodnego operowania na datach. Funkcje te są szybkie, ponieważ wewnętrznie operują na LICZBACH.

    Dużo mądrzejsi ludzie od Ciebie pracowali nad MySQL i wiedzieli po co tworzą pola TIMESTAMP, DATE i DATETIME. Nie dorastasz im do pięt, więc okaż trochę szacunku.

Leave a Comment Here's Your Chance to Be Heard!