In genere
per tutti i conti sul calendario si preferisce operare sul giorno espresso
come giorno giuliano, anziché nel formato ordinario DD/MM/YYYY.
Per
calcolare il giorno giuliano si operi come segue:sia
Y l’anno (es. 1998)
sia M il mese (1 per gennaio, 2 per febbraio, ecc.
sia D il giorno del mese.Se
(M = 1 o M = 2) allora (Y = Y – 1 e M = M + 12), altrimenti si
lascino invariati Y e M.Si
calcolino ora le quantità ausiliarieA
= INT(Y/100)
B = 2 – A + INT(A/4)il
giorno giuliano corrispondente saràJD
= INT(365,25·(Y + 4716)) + INT(30.6001·(M + 1))
+ D + B – 1524.5Dove
INT(x) è la parte intera di x.
Il precedente algoritmo vale anche per il calendario Giuliano,
avendo cura di porre B = 0.
Per conoscere
il giorno della settimana, è sufficiente calcolare il giorno giuliano
corrispondente alla data voluta ed operare come segue:
– si somma
1,5 al giorno giuliano
– si divide
il risultato per 7 e si considera il resto
– se il
resto è 0 è domenica, se è 1 è un lunedi,
e così via fino a 6, che corrisponde al sabato.
Per quanto
riguarda il numero della settimana, supponendo che la settimana inizi
con la domenica e si concluda con il sabato, si può calcolare il
giorno dell’anno:
N = INT(275·M/9)
– K·INT((M+9)/12)) + D – 30
dove M è
il mese, D il giorno del mese e K vale 1 se l’anno è bisestile,
2 negli anni ordinari. N vale 1 al 1 gennaio, 365 al 31 dicembre, o 366
se è un anno bisestile.
Noto il giorno dell’anno, si divide per 7 ed il quoziente indica quante
settimane sono trascorse dal 1 gennaio. Poi si calcola il giorno della
settimana del 1 gennaio: se e’ una domenica allora si aggiunge 1 al numero
della settimana, se e’ un altro giorno si aggiunge 2. Tuttavia per i giorni
compresi tra il primo giorno dell’anno e la prima domenica dell’anno si
deve aggiungere 1 e
non 2.
Probabilmente
esistono soluzioni meno macchinose, escogitate dai programmatori di sistemi
operativi, i cui comandi di data forniscono anche il numero della settimana.
Ecco altri
riferimenti utili:
http://www.eskimo.com/~scs/C-faq/q20.31.html
dayofweek(y, m, d) /* 0 = Sunday */
int y, m, d; /* 1 <= m <= 12, y > 1752 or so */
{ static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
http://www.cs.unb.ca/~alopez-o/math-faq/mathtext/node39.html#SECTION0011100000000000000000