[PHP] Jak samodzielnie obliczyć numer dnia w dowolnym roku?
Chcesz wyliczyć numer dnia w roku, np. 26 kwietnia 2004 r. będzie 117 dniem w 2004 roku.
Poniższy skrypt to raczej ciekawostka i algorytm dla dociekliwych. PHP ma wbudowaną funkcję obliczania dnia w roku, więc z pewnością z niej będziesz korzystać.
Jeżeli jednak zechcesz posłużyć się "ręczną" metodą obliczania dnia roku, przedstawiam ciekawy algorytm:
<?
function dzienroku($dzien, $miesiac, $rok) {
if (!checkdate($miesiac,$dzien,$rok)) return 0;
$n1 = floor(275*$miesiac/9);
$n2 = floor(($miesiac+9)/12);
$n3 = (1+floor(($rok-4*floor($rok/4)+2)/3));
return $n1-($n2*$n3)+$dzien-30;
}
// dla dnia: 26.04.2004:
echo dzienroku(26,4,2004); // wynik: 117
echo date("z")+1; // wynik: 117
?>
Algorytm pochodzi z książki Almanac for Computers, wydanej przez Nautical Almanac Office United States Naval Observatory. Jest bardzo dobry, ponieważ uwzględnia lata przestępne i pozwala liczyć dzień roku zarówno dla dat współczesnych, jak i tych z przeszłości (np. dla roku 876).
W funkcji dzienroku() sprawdzam czy przekazana data istnieje (gdyby ktoś zechciał wpisać np. dzień 31 lutego) i jeżeli data jest błędna funkcja zwraca 0, jeżeli dzień istnieje zwracany jest numer dnia od 0 do 366).
To samo można uzyskać stosując funkcję date() z atrybutem "z", tylko zwraca ona liczbę od 0 do 365, stąd trzeba do niej dodać 1 dzień.