narzędzia |
Wieczny kalendarz
Kalendarz wieczny – tabela lub wzór pozwalająca w prosty sposób odnaleźć określony dzień tygodnia w kalendarzu gregoriańskim dla każdej daty w postaci dzień miesiąca, miesiąc, rok. Przy pomocy wiecznego kalendarza nie ma możliwości obliczenia np: roku na podstawie daty w postaci: dzień tygodnia, dzień miesiąca - gdyż dni tygodnia dla danego dnia miesiąca powtarzają się acyklicznie w kalendarzu gregoriańskim.
[edytuj] Uniwersalny wzór Zellera dla lat 1 - 9999 n.e.Kalendarz stuletni daje sprowadzić się do dość prostego algorytmu, który w pierwotnej wersji został zaproponowany przez Christiana Zellera, w kolejnych publikacjach, które ukazywały się w latach 1882-1886 (m.in. w Acta Mathematica, vol.9 (1886-1887), pp.131-6). Algorytm Zellera został uproszczony przez matematyka, Mikea Keitha do postaci:
Zaletą wzoru Mike'a Keitha jest możliwość zapisania go w języku programowania C w jednej linii liczącej raptem 45 znaków:
która to linia kodu generuje wartość kodującą dzień tygodnia od niedzieli (0) do soboty (6) Aby ten wzór był poprawny dla lat od 1 do 1582 trzeba uwzględnić różnicę pomiędzy stylem juliańskim a gregoriańskim która wynosi C - C div 4 - 2 (po przesunięciu początku roku do 1 marca) Wzór ten został opublikowany w Journal of Recreational Mathematics, Vol. 22, No. 4, 1990, p. 280. [edytuj] Implementacja w PascaluZapis w języku Pascal algorytmu obliczania dnia tygodnia w kalendarzu gregoriańskim (bez ww. poprawki dla kalendarza juliańskiego): function dzien_tygodnia(Year,Month,Day:word):string; var M,C,D,N:integer; const week:array[0..6]of string[12]=('Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'); begin M := 1 + (Month + 9) mod 12 ; if M>10 then Dec(Year) ; C := Year div 100 ; D := Year mod 100 ; N := ((13*M-1) div 5 + D + D div 4 + C div 4 + 5*C + Day) mod 7 ; dzien_tygodnia:=week[N]; end;
Często wzór Zellera jest podawany w formie, w której występuje wartość 2*C zamiast 5*C, która to forma prowadzi jednak przy niektórych latach do wartości N - ujemnych oraz nie sprawdza się dla niektórych dat. [edytuj] Implementacja w COto funkcja napisana na podstawie algorytmu Zellera char* week[7]={"Niedziela","Poniedzialek","Wtorek","Sroda","Czwartek","Piatek","Sobota"}; int zeller(int d,int m,int y,int s){ int Y,C,M,N,D; M=1+(9+m)%12; Y=y-(M>10); C=Y/100; D=Y%100; if (s!=0) N=((13*M-1)/5+D+D/4+C/4+5*C+d)%7; else N=((13*M-1)/5+D+D/4+6*C+d+5)%7; return (7+N)%7; } Oto funkcja napisana na podstawie analizy tablic zamieszczonych w Małej Encyklopedii Powszechnej PWN z 1959 r. char* week[7]={"Niedziela","Poniedzialek","Wtorek","Sroda","Czwartek","Piatek","Sobota"}; int dow(int m, int d, int y, int s) { int mon[12]={0,1,1,2,5,6,2,3,4,0,1,4}; int leap; int a,b,c; leap=(s==0&&y%4==0||s!=0&&(y%4==0&&y%100!=0||y%400==0)); a=(y%100)%28; b=(s==0)*(4+(y%700)/100+2*(a/4)+6*((!leap)*(1+(a%4))+(leap)*((9+m)/12)))%7+ (s!=0)*(2*(1+(y%400)/100+(a/4))+6*((!leap)*(1+(a%4))+(leap)*((9+m)/12)))%7; c=(3*mon[m-1]+d)%7; return (c+6*b)%7; } Funkcja zwraca indeks do tablicy "week". Parametr s oznacza styl
[edytuj] Kalendarze stuletnieNa podstawie wzoru Zellera można w prosty sposób utworzyć tabele, które bywają nazywane kalendarzami stuletnimi choć mogą one praktycznie obejmować dowolny okres. Przykładowy "kalendarz stuletni" (a właściwie stuczterdziestoletni) dla lat 1901-2040:
[edytuj] Bibliografia
księżycowy • księżycowo-słoneczny • słoneczny aztecki • babiloński • bizantyjski • chiński • chrześcijański • egipski • etiopski • francuski rewolucyjny • gregoriański • hinduski • japoński • juliański • kambodżański • koptyjski • laotański • Majów • muzułmański • perski • radziecki • rzymski • słowiański • starogrecki • tamilski • wieczny • "World Calendar" • żydowski |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||