Sto cercando informazione sull’algoritmo del calendario gregoriano. Il mio problema è il seguente: Dato il campo data ovvero input = DD/MM/YYYY voglio determinare il giorno della settimana e il numero della settimana dell’anno in corso, ovvero output1 = num. settimana e output2 = giorno della settimana = {lun | mar | …| dom}.

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à ausiliarie

A
= 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.5

Dove
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