Cauta rapid aici ↑

PHP - Fus orar

PHP ne ofera o varietate de functii pe care le putem folosi pentru a afla fusul orar pe care un utilizator se afla. Mai mult decat atat PHP are inclus si clasele DateTime si DateTimeZone ce contin diferite cunostinte pe care le putem folosi in proiectele noastre.

Despre zone de fus orar

Istoria fusului orar

Istoria fusului orar incepe din momentul aparitiei primelor asezari omenesti. Oamenii acelor vremuri erau raspanditi pe toate continentele si fiecare asezare isi desfasura activitatea in functie de pozitia soarelui pe cer. La acea vreme inca nu se inventase ceasul.

Pe masura ce aceste asezari omenesti sau dezvoltat si au inceput sa comunice intre ele, a aparut si nevoia de a stabili un punct de reper reprezentand un moment din zi in care doua persoane aflate la distante apreciabile si la care pozitia soarelui pe cer era diferita se puteau intalni.

In timp s-a inventat ceasul si ceasul din turn si acesta reprezenta un barometru al activitatilor zilnice in toate asezarile omenesti. Daca vroiai sa afli daca era miezul zilei, atunci te puteai uita la ceasul din turn si vedeai la ce moment din zi te afli dar de cele mai multe ori acest ceas din turn te anunta printr-un sunet specific cand este miezul zilei sau ora 12.00. Totodata ceasul a fost folosit si ca unitate de timp pentru diferite magazine ce isi desfasurau activitatea intre anumite ore din zi.

Concepte mai avansate in masurarea timpului au aparut odata cu aparitia transportului si a telecomunicatiilor. Acestea aveau nevoie de o unitate de masura a timpului mai avansata decat putea sa ofere tehnologia acelor vremuri.

In secolele 16 si 17 aveam corabii destul de avansate iar in secolul 18 au aparut caile ferate. Secolele 19 si 20 ne-a adus transportul cu masinile, avioanele si in cele din urma am ajuns in era in care puteam trimite un om in spatiu sau pe Luna. Toate aceste inventii necesitau o masurare a timpului foarte exacta mai ales ca in diferite zone ale planetei soarele rasarea si apunea in diferite momente ale zilei.

In prezent ne este foarte usor sa vorbim cu o alta persoana ce se afla pe un alt fus orar si asta pentru ca tehnologia ne ofera acest lucru cu usurinta. Acest lucru nu a fost intotdeauna asa si din acest motiv in anul 1675 a fost inventat GMT ce reprezinta acronimul de la Greenwich Mean Time. GMT a fost inventat ca urmare a construirii observatorului astronomic Royal din parcul Greenwich din Londra.

Acest observator a fost creat ca urmare a nevoii capitanilor de nave britanice sa afle pozitia navei pe glob. La acel moment Marea Britanie detinea cea mai mare flota maritima din lume si din acest motiv ei au fost cei care aveau nevoie sa afle mai repede pozitia unei nave pe glob. Mai mult decat atat datele oferite de observatorul astronomic Royal erau foarte exacte pentru acea vreme.

Standardul GMT a fost adoptat de toate orasele din Marea Britanie in anul 1855 iar acest lucru a usurat munca companiilor ferate pentru ca era mai simplu sa calculezi timpul pe care il va face un tren pana la destinatie sau pana la o anumita statie iar oamenii stiau ora exacta la care trenul va ajunge.

Totodata pozitia soarelui pe cer reprezinta un barometru foarte important si asta pentru ca o tara poate avea o suprafata foarte mare iar soarele va rasare la ore diferite pentru diferite orase. Din acest motiv vom vedea tari ce au mai multe fusuri orare dar si tari vecine cu fusuri orare foarte diferite. Intre anii 1900 si 1929 majoritatea tarilor globului au trecut la GMT si odata cu asta a aparut si notiunea de fus orar.

Fusul orar este calculat impartind numarul de grade pe care planeta o face cand se roteste in jurul propriei axe in 24 de ore si mai exact 360 / 24 = 15. Cifra 15 ne va spune ca vom avea 15 fusuri orare reprezentand in cea mai mare parte diferente orare calculate in ore si rareori in minute. Fusul orar nu este stabilit doar de pozitia tarii respective pe glob si implicit a momentului din timpul universal cand soarele rasare. Acesta poate fi stabilit si de politica tarii respective printr-o lege si din acest motiv vom vedea tari vecine ce au acelasi fus orar sau sunt la trei ore distanta chiar daca sunt tari vecine.

UTC

UTC reprezinta acronimul de la Coordinated Universal Time si desi este un pic ciudat aranjarea literelor, acesta reprezinta un compromis politic de la acea vreme. UTC a fost creat in anul 1960 si se bazeaza intr-o masura pe GMT.

Desi UTC se bazeaza pe GMT, acesta este putin diferit si asta pentru ca UTC se bazeaza nu doar pe masuratorile astronomice ci si pe masuratorile efectuate la nivel atomic si din acest ultim motiv noi programatorii il vom folosi in programele noastre.

Setarile de baza in lucrul cu fusul orar

Zone cu fus orar

Site-ul oficial PHP ne ofera o pagina unde putem afla mai multe despre zonele pe glob cu diferite fusuri orare. Aceasta pagina se gaseste la urmatorul link. http://php.net/manual/en/timezones.php

PHP ne ofera aceleasi informatii accesand o functie predefinita sau instantiind static o metoda dintr-o clasa. Aceste functii ne vor returna un array cu toate zonele geografice pe care PHP le are in gestiune.

  • timezone_identifiers_list()
  • DateTimeZone::listIdentifiers()

O alta functie utila in lucrul cu fusul orar este urmatoarea functie care va avea cel mai adesea doar un singur parametru reprezentand o abreviere sau un acronim ca valoare. Functia va returna un string reprezentand zona geografica catre care vom face referire.

		echo timezone_name_from_abbr('CET'); // Europe/Berlin
		echo timezone_name_from_abbr('EST'); // America/New_York
		echo timezone_name_from_abbr('EDT'); // America/New_York
		echo timezone_name_from_abbr('EASST'); // Chile/EasterIsland
	

Setarile din fisierul php.ini

In momentul cand vrem sa aflam o data sau o ora ori alta informatie cu ajutorul functiilor sau metodelor care fac acest lucru fara sa setam fusul orar in fisierul php.ini pana la versiunea PHP 5 inclusiv, interpretorul de PHP ne va afisa o eroare prin care ne va cere sa rezolvam setarea fusului orar.

In fisierul php.ini va trebui sa cautam linia de cod → ;date.timezone = ← (pe care o vom decomenta prin inlaturarea caracterului punct si virgula) si ca valoare va trebui sa ii dam un string reprezentand una din valorile ce reprezinta fusul orar. Acest string il vom scrie exact asa cum este el afisat in array-ul returnat de functia timezone_identifiers_list() sau de metoda DateTimeZone::listIdentifiers().

In PHP 7 interpretorul de PHP nu va returna nici-o eroare si asta pentru ca acesta vine deja cu o setare reprezentand fusul orar dupa care acesta lucreaza. Vom putea vedea acest lucru folosind functia phpinfo() si apoi vom cauta → default timezone.

Nu in ultimul rand va trebui sa repornim serverul daca am avut acces la acest fisier si am facut aceste modificari. Nu intamplator am spus daca am avut acces la acest fisier si asta pentru ca daca am avea un site web gazduit pe un server, atunci cel mai probabil nu vom avea drepturi de a modifica acest fisier si asta pentru ca serverul unde interpretorul de PHP ruleaza mai are in gestiune si alte site-uri web pe care trebuie sa le serveasca browserelor pe diferite fusuri orare decat al nostru. Din acest motiv vom putea seta in fisierele noastre ce tip de fus orar sa folosim in script-urile noastre.

Seteaza sau afla fusul orar in timpul rularii script-urilor

Setarea sau aflarea fusului orar in timpul rularii programelor noastre o vom face folosindu-ne de urmatoarele functii predefinite ale limbajului.

		date_default_timezone_set('Europe/Berlin');
		echo date_default_timezone_get(); // Europe/Berlin
	

In momentul cand interpretorul de PHP va intalni functia date_default_timezone_set ce va avea ca singur parametru string-ul reprezentand fusul orar dupa care vrem ca programele noastre sa ruleze, va ignora setarea din fisierul php.ini prin care puteam seta fusul orar.

Functia date_default_timezone_get ne va returna fusul orar dupa care programele noastre ruleaza.

Functii predefinite pentru lucrul cu timpul

PHP ofera cateva functii foarte utile pentru aflarea timpului UTC (sau timpul UNIX), aflarea datei sau orei din zi dar si multe altele dupa cum va sunt prezentate functiile predefinite de mai jos.

  • time(); // numarul de secunde trecute de la 1 Ianuarie 1970 ora 00.00 (UTC)
  • strtotime('string'); // converteste data in forma de string in format UTC
  • mktime($hour, $minute, $seconds, $month, $day, $year); // creaza o data in format UTC
  • date($format, $utc_time); //
  • strftime($format, $utc_time); //
  • checkdate($month, $day, $year); // returneaza true sau false daca data exista sau nu