PHPPamokos.lt


13. Data ir laikas

Vienas iš dažnai pasitaikančių poreikių tinklalapiuose yra darbas su data ir laiku. Ar tai yra straipsnio parašymo datos išvedimas, ar vakar dienos duomenų parodymas, ar visas kalendorius - visa tai susiję su tomis pačiomis PHP funkcijomis, kurių datoms formatuoti, apdoroti ir atvaizduoti yra pakankamai nemažai.

Funkcija time()

Ši funkcija neturi parametrų ir grąžina tiesiog dabartinį laiką pagal serverio nustatymus. Svarbu žinoti, kad tas laikas grąžinamas ne su pilna data ir valandomis/minutėmis, o tiesiog kaip vienas ilgas skaičius, kuris reiškia laiko momentą pagal UNIX sistemą, tas skaičius dar vadinamas UNIX Timestamp. Faktiškai, jis reiškia sekundžių skaičių, praėjusių nuo 1970 m. sausio 1 d.

Kam to reikia? Ogi tam, kad kai gaunate sekundžių skaičių kaip sveikąją reikšmę, galima su ja atlikti įvairias matematines gudrybes - formatuoti, kopijuoti ir t.t. Be to, reikia prisiminti, kad daug PHP funkcijų kaip parametrą priima būtent Timestamp formato laiką.

 

Funkcija date()

O dabar priėjome prie klausimo, kaipgi galima formatuoti datą ir laiką, prieš išvedant į ekraną. Kaip iš to jau minėto UNIX laiko padaryti normalias valandas, minutes, sekundes ir kt. Būtent tam yra skirta funkcija date(), kuri turi du parametrus. Pirma, jai paduodamas formatas, kuriuo reikia suformatuoti laiką, o kitas parametras - pats laikas UNIX formatu. Antras parametras nebūtinas, jei jis nepaduodamas - imamas dabartinis serverio laikas su funkcija time().

Konkretūs funkcijos panaudojimo pavyzdžiai:

echo date("Y-m-d"); // dabartinė data formatu METAI-MĖNUO-DIENA
echo date("Y-m-d H:i:s"); // išvedama dabartinė data ir laikas
echo date("H:i:s", time()-60); // laikas prieš minutę (60 sekundžių)

Kaip matote, pavyzdžiuose kiekvienas formato simbolis turi kažkokią reikšmę. Pagrindinius simbolius galite pamatyti žemiau lentelėje:

Y metai
m Mėnuo
d Diena
H Valanda
i Minutė
s Sekundė
w savaitės diena (skaičius nuo 0 iki 6, 0 reiškia sekmadienį)

Ir taip toliau, formatavimo ženklų dar yra labai daug. Iš šitų specialių simbolių ir jums reikalingų skyrybos ženklų galite sudarinėti datos ir laiko formatą išvedimui į ekraną.

 

Funkcija strtotime()

Kartais prireikia ir atvirkštinio veiksmo. Sakykime, puslapio lankytojas įvedė į formos lauką datą formatu YY-MM-DD, o jums reikia ją aprodoti kaip UNIX laiką, kad galėtumėte paduoti kaip parametrą kitoms PHP funkcijoms. Tam skirta funkcija strtotime(), kuri praktiškai paima tekstinę eilutę ir bando joje atrasti vieną iš datos bei laiko formatų, jei atranda - tada grąžina UNIX formato laiką sekundėmis.

Pavyzdys:

$data = "2014-03-05 18:20:00";
$laikas = strtotime($data) - 20*60; // nustatome laiką prieš 20 minučių

Taip pat pravartu žinoti, kad funkcija strtotime() kaip parametrą priima laiką ne tik įprastu YYYY-MM-DD formatu, bet ir įvairiausiais tekstiniais formatais, pvz taip:

echo strtotime("+1 day");
echo strtotime("+1 week");
echo strtotime("+1 week 2 days 4 hours 2 seconds");
echo strtotime("next Thursday");
echo strtotime("last Monday");
 

DateTime ir DateTimeZone

Šios funkcijos, aptartos viršuje, atlieka bazinius veiksmus su laiku, bet to dažnai nepakanka. Kaip patogiau apskaičiuoti skirtumą tarp dviejų datų? Kaip dirbti su laiko juostomis? Šiuos ir daugybę kitų klausimų išsprendė PHP 5.2 versijoję pasirodžiusios DateTime klasės. Jas apžvelgsime minimaliai, nes kad pilnai suprastumėte jų veikimą, reikia mokėti objektinį programavimą, kurio skyrelio dar neturėjome. Bet paaiškinsiu DateTime esmę ir principus, o po to, jei norėsite, galėsite prie šios temos sugrįžti ir pasikartoti.

Taigi, kad sukurtumėme DateTime kintamąjį, naudojame operatorių new:

$date = new DateTime();

Arba galime iškart paduoti datą ir laiką kaip parametrą:

$date = new DateTime('May 20th, 2014');

Ir tada kintamasis $date gaunasi kaip objektas, kuris savyje turi daugybę naudingų funkcijų, jas kviesime su komanda ->. Galime iškviesti pavyzdžiui tokias:

$date->getTimestamp(); // grąžina unix timestamp
$date->setDate(2013, 12, 30); // formatas - yyyy, mm, dd
$date->setTimestamp(1364790870); // paduodame unix timestamp

Turbūt, jums kyla klausimas - o kas iš to? Kokį privalumą turi toks variantas prieš paprastus time() ir date()? Taigi, prie to ir priėjome. Visų pirma, jei turime du DateTime objektus, tai lengva apskaičiuoti skirtumą tarp tų datų - su funkcija diff():

$time1 = new DateTime('Apr 5, 2013');
$time2 = new DateTime('Apr 18, 2014');
$difference = $time1->diff($time2);

Šiuo atveju rezultatas, $difference, taip pat bus ne skaičius, o objektas, kurį vėliau galima išvesti į ekraną kaip tik norite - tik valandomis, minutėmis ar panašiai.

Taip pat, kaip jau minėjau, DateTime leidžia patogiai dirbti su laiko juostomis. Tiksliau, čia jau reikia dirbti su kiek kitokiu tipu DateTimeZone. Sakykime, kad turime jau datą, ir norime jai priskirti kitokią laiko juostą:

$timezone = new DateTimeZone('Europe/London');
$time->setTimezone($timezone);

Visų PHP kalboje priimtų laiko juostų pavadinimus (tokius kaip "Europe/London") galite rasti šiame puslapyje - principas yra žemynas/miestas.



(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com