infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Savin Tiberiu din August 11, 2009, 12:56:33



Titlul: Bug Fix
Scris de: Savin Tiberiu din August 11, 2009, 12:56:33
Am avut putin de furca cu un bug dubios in timp ce lucram la un site si am zis ca sa pun aici bugul pentru ca sunt curios cata lume s-ar prinde care e problema (si cat de repede :) ). Eu am pierdut cam o ora din cauza asta.

Consideram functia strtotime din php (functie care pentru o anumita data returneaza numarul de secunde trecute de la 1 Jan 1970).
Avem o perioada data prin data de inceput si data de sfarsit. De ex: 01-05-2009, 05-05-2009.
Vrem sa calculam numarul de zile din aceasta perioada si avem urmatorul cod.
Cod:
//in PHP variabilele incep cu semnul $. 
//$start -> o variabila in care avem data de inceput a perioadei
//$end -> data de sfarsit
$cnt = (strtotime($end) - strtotime($start)) / 86400;

Logica din spatele codului e destul de simpla. Vedem cate secunde au trecut de la $start pana la $end si impartim la 86400 (numarul de secunde al unei zile, 24 * 3600).
Problema ar fi ca pentru perioada 01-10-2009, 01-11-2009 acea expresie ne va da o valoare reala (impartirea nu va fi exacta). De ce?
PS: Puteti considera ca pentru o data de genul dd-mm-yyyy, strtotime returneaza numarul de secunde trecute pana la dd-mm-yyyy 00:00.
PPS: Prima persoane care raspunde corect are un + la karma de la mine :D.


Titlul: Răspuns: Bug Fix
Scris de: Emanuel Cinca din August 11, 2009, 13:09:49
Nu sunt foarte sigur, dar se stie ca anul nu are exact 365 de zile, el are aproximativ 365 de zile si 6 ore. 2008 a fost an bisect, dar in 2009 sunt 6 ore care inca nu sunt luate in considerare de noi (anul acesta avand 365 de zile). Nu stiu cum functioneaza exact functia, dar daca tine cont de asta, cam de acolo ar putea fii impartirea cu rezultat numar real.


Titlul: Răspuns: Bug Fix
Scris de: Savin Tiberiu din August 11, 2009, 13:24:00
Nu are legatura cu ani bisecti. Calculeaza pur si simplu numarul de secunde. Imagineaza-ti un contor care a inceput la 1 Jan 1970 si creste in fiecare secunda cu 1. Iar functia strtotime iti afiseaza la ce valoare ajunge acel contor pentru o anumita data.


Titlul: Răspuns: Bug Fix
Scris de: Gabriel Bitis din August 11, 2009, 13:25:22
Eu cred ca inca nu ti'ai dat nici tu seama care'i bugu, si vrei sa ti'l rezolvam noi !  \:D/  :P


Titlul: Răspuns: Bug Fix
Scris de: Cebere Bogdan din August 11, 2009, 13:28:18
Interesant e ca, daca scrii
Cod:
$cnt = (strtotime("2 February 2009") - strtotime("1 February 2008")) / 86400; 
afiseaza un numar intreg.


Titlul: Răspuns: Bug Fix
Scris de: Cristian Strat din August 11, 2009, 13:37:07
E cumva de la DST?


Titlul: Răspuns: Bug Fix
Scris de: Savin Tiberiu din August 11, 2009, 13:40:31
Da Cristi. Undeva prin octombrie (am impresia ca in ultima duminica sau ceva de genul, pentru anul 2009 e vorba de 25 octombrie) se trece la ora de iarna si ceasul se da cu o ora inapoi. Astfel apar 3600 de secunde in plus in acel calcul care creeaza acea eroare :).


Titlul: Răspuns: Bug Fix
Scris de: Emanuel Cinca din August 11, 2009, 13:43:59
Dar atunci bugul e pentru toata perioada orei de iarna, pana se trece din nou la ora de vara?


Titlul: Răspuns: Bug Fix
Scris de: Savin Tiberiu din August 11, 2009, 13:45:39
Nu e valabil numai pentru perioadele care trec prin ziua in care se schimba ora.


Titlul: Răspuns: Bug Fix
Scris de: Stefan Istrate din August 11, 2009, 15:58:14
Da Cristi. Undeva prin octombrie (am impresia ca in ultima duminica sau ceva de genul, pentru anul 2009 e vorba de 25 octombrie) se trece la ora de iarna si ceasul se da cu o ora inapoi. Astfel apar 3600 de secunde in plus in acel calcul care creeaza acea eroare :).
E in ultimul weekend din octombrie, intre sambata si duminica. :)