7. PHP – obsługa daty i czasu


Funkcje daty i czasu

Pełną listę funkcji znajdziecie w dokumentacji PHP,  poniżej najczęściej wykorzystywane.

time()

Zwraca aktualny uniksowy znacznik czasu

int time(void)

Zwraca aktualny czas, podawany jako liczba sekund, które upłynęły od nastania Ery Unixu: 1 stycznia 1970, 0:00:00 GMT.

$teraz = time();
$następnyTydzien = time() + (7 * 24 * 60 * 60); // 7 dni; 24 godziny; 60 minut; 60 sekund

date()

Formatuje lokalny czas/datę.

string date ( string $format [, int $timestamp = time() ] )

Jako $format podajemy odpowiedni schemat zapisu z tabeli poniżej, a $timestamp to znacznik czasowy – nie musimy go podawać, jest ustawiany automatycznie (jest to ilość sekund od nastania Ery Unixu: 1 stycznia 1970, 0:00:00 GMT).

Przykład:

echo date("l");                     // wyświetli Monday
echo date("m.d.y");                 // wyświetli 03.10.01
echo date("j, n, Y");               // wyświetli 10, 3, 2001
echo date('l jS \of F Y h:i:s A');  // wyświetli Monday 8th of August 2005 03:12:46 PM

echo date('Y-m-d', time()+(7*24*60*60)); //wyświetli datę za tydzień (7*24*60*60=604800 tyle sekund ma tydzień)

date() zwraca datę sformatowaną zgodnie z szablonem przedstawionym w poniższej tabeli.

Poniższych znaków używa się jako tekstu w parametrze format

Zawartość parametru formatOpisPrzykład zwróconej wartości
Dzień
dDzień miesiąca, 2 cyfry z wiodącymi zerami01 do 31
DTekstowy opis angielskiej nazwy dnia, trzy literyMon kończąc na Sun
jDzień miesiąca bez zer wiodących1 do 31
l (mała litera 'L’)Pełen angielski opis dnia tygodniaSunday aż do Saturday
NLiczbowa forma dnia tygodnia, zgodna z normą ISO-8601 (dodana
w PHP 5.1.0)
1 (dla Poniedziałku) aż do 7 (dla Niedzieli)
SAngielski przyrostek porządkowy dla dnia miesiąca, 2 literyst, nd, rd lub
th. Dobrze wygląda w połączeniu z j
wLiczbowa forma dnia tygodnia0 (dla Niedzieli) aż do 6 (dla Soboty)
zDzień roku (Zaczynając od 0)0 aż do 365
Tydzień
WNumer tygodnia w roku, zgodny z normą ISO-8601, Tygodnie rozpoczynają Poniedziałki (dostępne od PHP 4.1.0)Przykład: 42 (42. tydzień roku)
Miesiąc
FPełen angielski opis, dnia miesiąca, taki jak January czy MarchJanuary aż do December
mLiczbowa forma miesiąca, z zerami wiodącymi01 aż do 12
MKrótki, angielski opis miesiąca, trzy literyJan a do Dec
nLiczbowa forma miesiąca, bez zer wiodących1 aż do 12
tIlość dni w danym miesiącu28 do 31
Rok
LInformacja o tym, czy rok jest przestępnym1 jeśli rok jest przestępny, 0 w przeciwnym wypadku.
oNumer roku, zgodny z normą ISO-8601. Zwraca to taką samą wartość jak
Y, z takim wyjątkiem, że numer tygodnia ISO
(W) należy do poprzedniego lub następnego roku, niż rok
użyty w tym miejscu. (dodane w PHP 5.1.0)
Przykłady: 1999 lub 2003
YPełna liczbowa forma roku, 4 cyfryPrzykłady: 1999 lub 2003
yDwie cyfry reprezentujące rokPrzykłady: 99 or 03
Czas
aPora dnia – dwie małe litery (przed/po południu) (ang. Ante/Post meridiem)am lub pm
APora dnia – dwie duże litery (przed/po południu) (ang. Ante/Post meridiem)AM lub PM
BSwatch Internet Time000 aż do 999
gGodzina, w formacie 12-godzinnym, bez zer wiodących1 aż do 12
GGodzina, w formacie 24-godzinnym, bez zer wiodących0 aż do 23
hGodzina, w formacie 12-godzinnym, z zerami wiodącymi01 aż do 12
HGodzina, w formacie 24-godzinnym, z zerami wiodącymi00 through 23
iMinuty z zerami wiodącymi00 do 59
sSekundy, z zerami wiodącymi00 aż do 59
uMikrosekundy (dodano w PHP 5.2.2)Przykład: 54321
vMilisekundy (dodano w PHP 7.0.0).Przykład: 654
Strefa czasowa
eIdentyfikator strefy czasowej (dodano w PHP 5.1.0)Przykłady: UTC, GMT, Europe/Zagreb
I (duże i)Informacja o tym, czy czas jest letni1 jeśli czas jest letni, 0 w przeciwnym razie.
ORóżnica z czasem Greenwich (GMT) w godzinachPrzykład: +0200
PRóżnica z czasem Greenwich (GMT) z dwukropkiem pomiędzy godzinami i minutami (dodano w PHP 5.1.3)Przykład: +02:00
TSkrót dla strefy czasowejPrzykłady: EST, MDT
ZRóżnica dla strefy czasowej w sekundach. Wyrównanie to jest zawsze ujemne dla stref położonych na zachód
od południka 0, oraz dodatnie dla tych leżących na wschódod niego.
-43200 aż do 50400
Pełna Data/Czas
cData w standardzie ISO 8601 (dodana w PHP 5)2004-02-12T15:19:21+00:00
rData sformatowana zgodnie z » RFC 2822Przykład: Thu, 21 Dec 2000 16:01:07 +0200
USekundy liczone od ery UNIX-a (1 stycznia 1970 00:00:00 czasu Greenwich – GMT)Zobacz także time()

getdate()

Pobiera informację o dacie/czasie

array getdate ([ int $timestamp = time() ] )

Funkcja zwraca tablicę asocjacyjną, a $timestamp to znacznik czasowy – nie musimy go podawać, jest ustawiany automatycznie (jest to ilość sekund od nastania Ery Unixu: 1 stycznia 1970, 0:00:00 GMT).

Przykład:

$dzisiaj = getdate();
print_r($dzisiaj);

Zostanie wyświetlone:

Array
(
    [seconds] => 40
    [minutes] => 58
    [hours]   => 21
    [mday]    => 17
    [wday]    => 2
    [mon]     => 6
    [year]    => 2003
    [yday]    => 167
    [weekday] => Tuesday
    [month]   => June
    [0]       => 1055901520
)

microtime()

Zwraca aktualny uniksowy znacznik czasu z mikrosekundami

string microtime(void)

Zwraca łańcuch znaków „msec sec”, gdzie sec jest aktualnym czasem, mierzonym jako liczba sekund od uniksowej Epoki (1 stycznia 1970, 0:00:00 GMT), natomiast msec jest aktualną liczbą mikrosekund. Funkcja ta dostępna jest wyłącznie na systemach operacyjnych, które obsługują wywołanie systemowe gettimeofday().

Obydwie części łańcucha znaków są podawane w sekundach.

$time_start = microtime(true);
usleep(100);  //zawiesza wykonanie skryptu na czas wyrażony w mikrosekundach
$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Nie robiłeś nic przez $time sekund\n";

mktime()

Zwraca uniksowy znacznik czasu dla konkretnej daty

int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

Zwraca liczbę sekund, które upłynęły od nastania Ery Unixu: 1 stycznia 1970, 0:00:00 GMT do podanej daty. Należy zwrócić uwagę na kolejność podawanych parametrów!

Poprawna kolejność parametrów to: godziny, minuty, sekundy, miesiąc, dzień, rok.

Aby wyświetlić np dzień tygodnia, w którym się urodziliście wystarczy dostosować poniższy kod

echo "Urodziłem się w ".date("l", mktime(0,0,0,7,15,2000));

strtotime()

Parsuje większość angielskich tekstowych opisów daty i czasu do uniksowego znacznika czasu

int strtotime ( string $czas [, int $teraz ] )

Funkcja przyjmuje tekst zawierający datę w formacie angielskim i stara się przeliczyć ją na uniksowy znacznik czasu, zachowuje się zgodnie ze składnią daty wg GNU. W przypadku fiaska, zwracane jest -1.

echo "Data powiększona o tydzień to ".date("d.m.y", strtotime('+7 days', time()));

echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";

Lista formatów dostępna tutaj.

Przykłady:

Liczenie czasu generowania strony

$start = microtime(true);

for ($i = 0; $i < 10000; $i++) {
   $str = 'test';
}

$end = microtime(true);

echo 'strona wygenerowana w '.($end - $start).' sekund';

Tworzenie daty o godzinę w przód

$czas_akt = time();
$za_godz = $czas_akt + 3600;
echo date("r", $za_godz); // Wyświetli datę 'za godzinę'           

Data „za miesiąc”

$day   = date('d'); // dzień
$month = date('m'); // miesiąc
$year  = date('Y'); // rok

// dodanie jedynki do miesiąca
$month++;

// sprawdzenie czy licznik się nie przekręcił
if ($month == 13) {
   $month = 1;
   $year++;
}       

Odliczanie czasu do konkretnego wydarzenia:

function CountDown($hour, $minute, $second, $month, $day, $year) 
{ 
$eventDate = mktime($hour, $minute, $second, $month, $day, $year); 
$today = time(); 
$secondsTo = $eventDate - $today; 
$minutesTo = round($secondsTo / 60); 
$hoursTo = round($minutesTo / 60); 
$daysTo = round($hoursTo / 24); 
$weeksTo = round($daysTo / 7); 
$monthsTo = round($weeksTo / 4); 
$yearsTo = round($monthsTo / 12); 
$values = "seconds ".$secondsTo.", minutes ".$minutesTo.", hours ".$hoursTo.", days ".$daysTo.", weeks ".$weeksTo.", months ".$monthsTo.", years ".$yearsTo; 
return $values; 
}
echo CountDown(12,0,0,10,5,2019);

Baner zależny od pory dnia

function getBannerName()
{
$hour = date("G");
if($hour > 22 || $hour < 4){
return("banner1.gif");
}
else if($hour >= 4 && $hour < 12){
return("banner2.gif");
}
else if($hour >= 12 && $hour < 18){
return("banner3.gif");
}
else if($hour >= 18 && $hour <= 22){
return("banner4.gif");
}
}

$str = "<IMG SRC='". getBannerName() ."'>";
echo($str);

Sprawdzanie czy daty są z tego samego dnia

<?php

function sameDay($ts1, $ts2)
{
   if (date("Y", $ts1) != date("Y", $ts2)) {
      return False;
   }
   if (date("m", $ts1) != date("m", $ts2)) {
      return False;
   }
   if (date("d", $ts1) != date("d", $ts2)) {
      return False;
   }
   return True;
}

$date1 = mktime(19, 30, 0, 12, 10, 2001);   
$date2 = mktime(10, 12, 0, 12, 10, 2001);   
$date3 = mktime(19, 30, 0, 12, 11, 2001);   

if (sameDay($date1, $date2)) {
   echo "Daty 1 i 2 są z tego samego dnia";
}

if (sameDay($date1, $date3)) {
   echo "Daty 1 i 3 są z tego samego dnia";
}
?>

Zadania do wykonania:

Zadanie 1: Napisz skrypt, który będzie pokazywał aktualna datę i czas w postaci:  Dzisiaj jest 30.10.2018 godzina 16:50:47

Zadanie 2: Napisz skrypt sprawdzający w jaki dzień tygodnia się urodziłeś/łaś oraz sprawdź ile czasu zostało do twoich urodzin.

Zadanie 3: Napisz skrypt sprawdzający czy dany rok jest przestępny wiedząc, że: rok jest przestępny tylko wtedy, jeśli dzieli się przez 4, ale nie dzieli się przez 100, chyba że dzieli się przez 400.