Przetwarzanie datyPHP posiada wiele funkcji, dzięki którym można przetwarzać zapis daty. Podstawowym sposobem zapisu daty w systemie Unix i pochodnych jest tzw. timestamp. Jest to ilość sekund jaka upłynęła od 1.1.1970 (moment ten nazywany jest Epoch). Zapis taki daje najwięcej możliwości - łatwo go przetwarzać na inne zapisy, dodawać, odjemować odpowiednie przedziały czasu i zapisywać w bazach danych. Sprawdzanie poprawnościJedną z podstawowych spraw przy odbieraniu danych od użytkownika to sprawdzenie ich poprawności. Funkcja checkdate() przyjmuje 3 argumenty - odpowiedno miesiąc, dzień i rok (kolejność może się wydawać nielogiczna, lecz w takiej kolejności Amerykanie zapisuję datę), których poprawność ma być sprawdzony. Funkcja zwraca logiczną wartość TRUE jeśli data jest poprawna. Funkcja ta sprawdza, czy rok ma wartości pomiędzy 1 a 32767, miesiąc między 1 a 12 a dzień od jeden do liczby zależnej od danego miesiąca. Uwzględniane są lata przestępne. W poniższym przykładzie sprawdzane są dane przekazane metodą GET. Dla wywołania test.php?dzien=12&miesiac=10&rok=1992 skrypt wyświetli "Data jest poprawna" a dla test.php?dzien=2&miesiac=14&rok=1980 - "Data jest niepoprawna". <?php
if (checkdate( $_GET['miesiac'], $_GET['dzien'], $_GET['rok'])) { echo 'Data jest poprawna'; } else { echo 'Data jest niepoprawna'; }
?>
Pobieranie aktualnej datyAktualną datę można uzyskać tylko w formacie timestamp. Datę taką zwraca funkcja time(). Dokładniejszy czas można uzyskać dzięki funkcji microtime() - dane zwracane przez tą funkcję zapisane są nieco dziwnie, ponieważ zwracany jest string zawierający oddzielone spacją odpowiednio część mikrosekundową i sekundową, czyli "msec sec". Poniższa funkcja zwraca czas w mikrosekundach. <?php function getmicrotime(){ list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } ?>
Informacja ta może zostać użyta do sprawdzenia czasu wykonania danego skryptu. <?php
$start = getmicrotime();
for ($i = 0; $i < 10000; $i++) { $str = 'test'; }
$end = getmicrotime();
echo '<!-- strona wygenerowana w '.($end - $start).' sekund -->';
?>
W ten sposób można też sprawdzać wydajność różnych rozwiązań. Skrypty wykonywane są zazwyczaj tak szybko, że mikrosekundy to za duża jednostka. Ograniczenie to można obejść przez wykonywanie konkretnych instrukcji w pętli, 100 czy nawet 1000 razy, podobnie jak w powyższym przykładzie. Funkcję konwertujące datę do podanego formatu jako parametr przyjmują timestamp daty do przekonwertowania. Parametr ten można jednak pominąć i zamiast określonej daty użyta zostanie aktualna data i czas. Pozwala to na uzyskanie aktualnego czasu w formacie innym niż timestamp. Konwersja daty do formatu timestampTimestamp inny niż aktualny można uzyskać na różne sposoby, które trzeba wykorzystać odpowiednio do zastosowania. Jeśli dostępna jest 'rozbita' data, czyli w osobnych zmiennych dzień, miesiąc, rok itp., lub można do takiej sytuacji doprowadzić przez odpowiednie użycie funkcji explode() lub substr(), można użyć funkcji mktime(). Funkcja ta jako argumenty przyjmuje odpowiednio godzinę, minutę, sekundę, miesiąc, dzień, rok i opcjonalnie informację o "daylight saving", czyli czasie letnim (wartość 1 oznacza czas letni, 0 w przeciwnym przypadku, lub -1, wartość domyślną, jeśli PHP ma samo zgadywać). <?php
$dzien = 10; $miesiac = 4; $rok = 2002; $godzina = 12; $minuta = 32; $sekunda = 0;
$ts = mktime($godzina, $minuta, $sekunda, $miesiac, $dzien, $rok);
?>
Jeśli data jest zapisana jako string, lecz w jednym z formatów rozpoznawanych przez PHP, string ten można przekonwertować do timestamp używając funkcji strtotime(). Data składa się z kilku elementów, oddzielonych białymi znakami (spacja, znak tabulacji). Białe znaki można pominąć, jeśli nie powoduje to żadnych wieloznaczności. Elementy daty to część kalendarzowa, część zegarowa, strefa czasowa, część wyłącznie liczbowa. Kolejność tych elementów nie ma znaczenia. Dwa inne elementy, dzień tygodnia i przesunięcie czasowe, zostaną opisane w dalszej części rozdziału. Część kalendarzowaCzęść ta określa konkretny dzień roku. Może być podana na jeden z wielu sposobów. 1970-09-17 # Zapis zgodny z ISO 8601.
70-9-17 # Domyślnie przyjmuje się bieżący wiek
70-09-17 # Wszystkie początkowe zera są ignorowane
9/17/72
24 September 1972
24 Sept 72 # Specjalny skrót słowa September
24 Sep 72 # Wszędzie dopuszczalne są trzyliterowe skróty
Sep 24, 1972
24-sep-72
24sep72
Dopuszczalne są angielskie nazwy miesięcy: `January', `February', `March', `April', `May', `June', `July', `August', `September', `October', `November' `December' oraz ich trzyliterowe skróty. Część zegarowaDopuszczalne formaty: 20:02:0
20:02
8:02pm
20:02-0500 # z podaniem strefy czasowej
Mówiąc ogólnie, podstawowy format to gg:mm:ss, przy czym część sekundową można pominąć. Jeśli na końcu dodany zostanie wskażnik am (rano - inna forma to a.m.) lub pm (po południu - p.m.), to część godzinowa ograniczona jest do zakresu 1-12. W takim zapisie północ to 12am, południe - 12pm; część minutowa może być pominęta. Opcjonalnie, od razu po czasie może zostać podana strefa czasowa w formacie "zggmm", gdzie "z" to odpowiedni znak + lub -, zależnie od strefy, gg to ilość godzin a mm ilość minut przesunięcia. Strefa czasowaStrefa czasowa może zostać określona tak samo jak w przypadku informacji "doklejonej" do części zegarowej. Część liczbowaLiczby w postaci rrrrmmdd, jeśli wcześniej nie było części kalendarzowej, traktowane są jako te części. Podobnie liczby w postaci ggmm jest traktowana jako część zegarowa, jeśli nie było takiej wcześniej. Dokładny opis formatów rozpoznawanych przez funkcję strtotime() można znaleźć pod adresem http://www.gnu.org/manual/tar-1.12/html_chapter/tar_7.html
|