kursy , szkolenia warszawa , e-book , audio book , poradniki , jak zarabiać , pieniądze , biznes , marketing e-commerce , e-biznes , zarabianie w sieci , servicetek group Bogdan Markowicz SG ,3 d e-learning , second life w edukacji , edukacja , 3d E-learning kursy i szkolenia Online |||S|G||| – Kurs PHP cz 12 Data i czas

Kurs PHP cz 12 Data i czas

Post image of Kurs PHP cz 12 Data i czas

12. Data i czas

12.1. Podstawy

W PHP istnieje bardzo dużo funkcji pozwalających na swobodne operowanie datą i czasem. Podstawowym formatem daty jest timestamp, czyli liczba sekund, która upłynęła od 1 stycznia 1970 roku. Taki zapis daje bardzo dużo możliwości, ponieważ pozwala np. na łatwe porównywanie dwóch dat poprzez ich odjęcie. Łatwo też jest przechowywać taki zapis w bazie danych czy w pliku, a dzięki odpowiednim funkcjom PHP można go bardzo prosto zamienić na format czytelny dla użytkownika.

12.2. Kilka przydatnych funkcji

Najprostszą akcją jest uzyskanie aktualnej daty i czasu w formacie timestamp. Wystarczy użyć funkcji time(). Dla przykładu:

<?
$teraz = time();
?>

Czasem zachodzi potrzeba sprawdzenia szybkości jakiegoś rozwiązania, np. fragmentu kodu PHP, i porównania jego wydajności z innym. W takim wypadku oczywiście nie ma sensu używanie funkcji time(), ponieważ zazwyczaj wykonanie całego skryptu PHP trwa niecałą setną sekundy. Z pomocą przychodzi funkcja microtime(). Zwraca ona jednak dane w nieco dziwny sposób ? część milisekundowa jest oddzielona spacją od części sekundowej. Poniżej zamieszczamy funkcję interpretującą dane z microtime() i zamieniającą je na coś bardziej czytelnego dla użytkownika:

<?
function getmicrotime(){
list($usec, $sec) = explode(” “,microtime());
return ((float)$usec + (float)$sec); //zwróć uwagę
na rzutowanie settype:)
}
?>

Powyższą funkcję można użyć do sprawdzenia czasu wykonywania skryptu. Dla przykładu:

<?
$start = getmicrotime();
//cały skrypt – jakieś instrukcje
$koniec = getmicrotime();
echo “Skrypt wykonał się w ”
.round($koniec-$start, 5).” sekund.”;
?>

12.3. Sprawdzanie daty

Aby sprawdzić, czy data wprowadzona np. w formularzu jest poprawna, należy posłużyć się funkcją checkdate(). Pobiera ona kolejno miesiąc, dzień i rok (kolejność zapisu daty w USA) i zwraca wartość TRUE, jeśli data jest poprawna, lub FALSE w wypadku błędu. Funkcja uwzględnia takie kwestie, że np. w roku przestępnym w lutym może być 29 dni.

<?
if (checkdate($_POST[month], $_POST[day],
$_POST[year])) {
//data jest poprawna – dalsze instrukcje
}
else {
//data niepoprawna – wprowadz jeszcze raz
Header(”Location:podaj_date.php?blad=1″);
}
?>

12.4. Data -> timestamp

Jeśli dysponujemy już zapisem daty np. wprowadzonej przez użytkownika w formularzu (dzień, miesiąc, rok, godziny, minuty i sekundy osobno), można ją łatwo zamienić na timestamp. Należy wtedy użyć funkcji mktime() i podać w jej parametrach kolejno: godzinę, minuty, sekundy, miesiąc, dzień i rok. Jako ostatni (niewymagany) parametr można podać 1 (jeśli jest to czas letni), 0 (jeżeli jest to czas zimowy) lub -1 bądź nie podawać niczego (wtedy interpreter PHP będzie sam zgadywał, jaki to czas). Dla przykładu:

<?
$time = mktime(23, 24, 11, 12, 4, 1999);
?>

Funkcja mktime() nadaje się także do poprawiania błędów w datach i wyliczania ostatnich dni miesiąca. Dla przykładu:

<?
$time = mktime(1, 1, 1, 12, 32, 1998);
$time = mktime(1, 1, 1, 13, 1, 1998);
$time = mktime(1, 1, 1, 1, 1, 1999);
$time = mktime(1, 1, 1, 1, 1, 99);
?>

Wszystkie powyższe przykłady utworzą datę 1 stycznia 1999, a błędy typu 32 grudnia czy 1 dnia 13. miesiąca roku zostaną automatycznie poprawione. Aby wyliczyć ostatni dzień danego miesiąca, należy podać jako argument dzień 0 (zero), a numer miesiąca o jeden większy. Poniższy przykład wyliczy ostatni dzień dla lutego 2000 roku.

<?
$ostatni = mktime (0,0,0,3,0,2000);
?>

12.5. timestamp -> data

W poprzednim paragrafie pokazywaliśmy, jak utworzyć datę w formacie timestamp. Jednak normalni ludzie mają niestety taką wadę, że nie potrafią czytać daty w tym formacie. Należy im wówczas zaserwować datę w formacie hh:mm:ss dd-mm-rrrr. Aby uzyskać taki efekt z formatu timestamp, należy użyć funkcji date(). Jako pierwszy argument pobiera ona format, w którym zwrócona ma być data, jako drugi zaś (opcjonalnie) datę w formacie timestamp. Funkcja zwraca datę sformatowaną zgodnie z szablonem w argumencie format. W szablonie podaje się specjalne znaki, które są później zamieniane na odpowiednie elementy daty lub czasu. Na przykład G jest zamieniane na godzinę w formacie 24-godzinnym. Oto lista wszystkich znaków do użycia w szablonie w funkcji date:

  • a ? ?am? lub ?pm?,
  • A ? ?AM? lub ?PM?,
  • B ? czas internetowy Swatcha,
  • d ? dzień miesiąca, dwie cyfry z zerem na początku, tzn. od ?01? do ?31?,
  • D ? dzień tygodnia, tekst, trzy litery, np. ?Fri?,
  • F ? miesiąc, tekst, pełna nazwa, np. ?January?,
  • g ? godzina, format 12-godzinny bez zera na początku, tzn. od ?1? do ?12?,
  • G ? godzina, format 24-godzinny bez zera na początku, tzn. od ?0? do ?23?,
  • h ? godzina, format 12-godzinny z zerem na początku, tzn. od ?01? do ?12?,
  • H ? godzina, format 24-godzinny z zerem na początku, tzn. od ?00? do ?23?,
  • i ? minuty; tzn. od ?00? do ?59?,
  • I (duża litera i) ? ?1?, jeśli czas oszczędzania światła słonecznego (w Polsce ? czas letni); ?0?, jeżeli czas standardowy (w Polsce zimowy),
  • j ? dzień miesiąca bez zera na początku, tzn. od ?1? do ?31?,
  • l (mała litera L) ? dzień tygodnia, tekst, pełna nazwa, np. ?Friday?,
  • L ? ?1?, jeśli rok przestępny; ?0? w przeciwnym wypadku,
  • m ? miesiąc, tzn. od ?01? do ?12?,
  • M ? miesiąc, tekst, trzy litery, np. ?Jan?,
  • n ? miesiąc bez zera na początku, tzn. od ?1? do ?12?,
  • O ? różnica w stosunku do czasu Greenwich, np. ?+0200?,
  • r ? data sformatowana według RFC 822, np. ?Thu, 21 Dec 2000 16:01:07 +0200? (dodane w PHP 4.0.4),
  • s ? sekundy, np. od ?00? do ?59?,
  • S ? standardowy angielski sufiks liczebnika porządkowego, dwie litery, tzn. ?st?, ?nd?, ?rd? lub ?th?,
  • t ? liczba dni w danym miesiącu, tzn. od ?28? do ?31?,
  • T ? strefa czasowa ustawiona na tej maszynie, np. ?EST? lub ?MDT?,
  • U ? liczba sekund od uniksowej Epoki (1 stycznia 1970 00:00:00 GMT),
  • w ? dzień tygodnia, liczbowy, tzn. od ?0? (Niedziela) do ?6? (Sobota),
  • W ? numer tygodnia w roku według ISO-8601, tydzień zaczyna się w poniedziałek (dodane w PHP 4.1.0),
  • Y ? rok, cztery liczby, np. ?1999?,
  • y ? rok, dwie liczby, np. ?99?,
  • z ? dzień roku, tzn. od ?0? do ?365?,
  • Z ? ofset strefy czasowej w sekundach (tzn. pomiędzy ?-43200? a ?43200?). Ofset dla stref czasowych na zachód od UTC (południka zero) jest zawsze ujemny, a dla tych na wschód od UTC jest zawsze dodatni.

Jeśli nie chcemy, aby jakiś znak był zamieniony na swój odpowiednik, trzeba przed nim dać znak \. Jeżeli ten znak razem z \ tworzy jakiś znak specjalny, to trzeba go poprzedzić podwójnym \ (np. \t to znak tabulacji, a to znak nowej linii). Dla przykładu:

<?
echo date(?l \\t\h\e jS?);
// wyświetla tekst typu ‘Saturday the 8th’
?>

Warto dodać, że choć na razie część znaków nie jest używana przez date(), to powinno się cytować wszystkie znaki, które nie mają być zamienione. Dzieje się tak, ponieważ w nowych wersjach PHP do date() wprowadzane będą coraz to nowe symbole. Dla przykładu:

<?
$today = date(’\i\t \i\s \t\h\e jS \d\a\y.’);
// It is the 10th day.
?>

Poniżej inny przykład użycia date(), zaczerpnięty ze strony php.net:

<?
$today = date(”F j, Y, g:i a”); // March 10, 2001, 5:16 pm
$today = date(”m.d.y”); // 03.10.01
$today = date(”j, n, Y”); // 10, 3, 2001
$today = date(”D M j G:i:s T Y”); // Sat Mar 10 15:16:08 MST 2001
$today = date(”H:m:s \m \i\s\ \m\o
\t\h”); // 17:03:17 m is month
$today = date(”H:i:s”); // 17:16:17
?>

Posted by Bogdan Markowicz   @   23 Listopad 2009

Like this post? Share it!

RSS Digg Twitter StumbleUpon Delicious Technorati Facebook

0 Comments

No comments yet. Be the first to leave a comment !
Leave a Comment

Name

Email

Website

Previous Post
« Kurs PHP cz 11 Klasy w PHP5
Next Post
3 książki, dzięki którym staniesz się BOGATYM STUDENTEM i dasz sobie szansę na wolność finansową po studiach »
Pismo nalezy do Servicetek Group   |   SG e-biznes e-commerce projektowanie www designed by SG Grupa e-learning