[PHP] Jak samodzielnie obliczyć numer dnia w dowolnym roku?

0x01 graphic

Chcesz wyliczyć numer dnia w roku, np. 26 kwietnia 2004 r. będzie 117 dniem w 2004 roku.

0x01 graphic

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ń.