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










Jaja sobie robisz… WON z planety!
W ostatnim przykładzie nie łatwiej było użyć funkcji strtotime?
A o strtotime() to Pan nigdy nie słyszał?
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.
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’));
Bardzo pomocny wpis wyjaśniający w końcu w jasny i klarowny sposób dlaczego tak a nie inaczej. Dziękuję.
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.
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’))
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.
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.