Lorenzo Braidi
TIPS - Il giorno di Pasqua
   
:: Consulenza
Home Page
Consulenza
Formazione
 
:: Editoria
Articoli
Libri
Tips!
Recensioni
 
:: Risorse
Documenti
Software
Link
 
:: Lorenzo
Blog
Curriculum
 
:: Newsletter



Gli indirizzi registrati NON saranno ceduti a
terzi, nè utilizzati per scopi differenti da quelli indicati.

 

 


Ci sono almeno due algoritmi con cui - chi prima, chi poi - tutti ci siamo trovati a doverci confrontare:
  • Il calcolo del codice fiscale,
  • il calcolo del Lunedì di Pasqua

Sul primo si è scritto molto, ed io stesso ho contribuito ad aumentare le pagine ad esso dedicato pubblicando su Visual Basic & .NET Journal l'articolo "Calcolo del codice fiscale in VB6" nei primi mesi del 2004.
Sulla  Pasqua, invece, si trovano molti meno esempi ed articoli, tantè che spesso si tende ad inserire nei propri programmi un elenco dei giorni di Pasqua dei successivi 20 anni senza implmentare alcun algoritmo di calcolo.

Provo a colmare questa lacuna, anche se - come si vedrà - l'algoritmo risulta essere parecchio empirico e richiede "aggiustamenti" per poter funzionare correttamente.
In generale diciamo che

  1. Il giorno di Pasqua (e di conseguenza il Lunedì di Pasqua) cade nella prima Domenica che succede al plenilunio immediatamente successivo all'equinozio di primavera.
  2. per ragioni astronomiche la data può variare tra il 22 di Marzo ed il 25 di Aprile

Il calcolo si basa su tre variabili, due delle quali sono il risultato di una tabella compilata a priori e statica che ha lo scopo di "aggiustare" il calcolo, la terza è l'anno del quale si vuole conoscere la data del giorno di Pasqua.

1583-1699 22 2
1700-1799 23 3
1800-1899 23 4
1900-2099 24 5
2100-2199 24 6
2200-2299 25 0
2300-2399 26 1

Possedendo i dati di questa tabella, è sufficiente  eseguire cinque divisioni e considerare i loro resti per ottenere il risultato.desiderato. Come si vede dall'esempio che riporto di seguito, il risultato è un numero che può essere superiore o inferiore a 31. Se è inferiore a 31, allora si considera quel numero come il giorno del mese di Marzo, in caso contrario, si sottre 31 e si considera come mese Aprile.

Riporto qui di seguito una stored procedure per SQL server che realizza tale algoritmo.

CREATE PROCEDURE GetPasqua (
@Anno INT,
@Pasqua DATETIME OUTPUT)
AS
DECLARE @T1 INT
DECLARE @T2 INT
DECLARE @T3 INT
DECLARE @T4 INT
DECLARE @T5 INT
DECLARE @Var1 INT
DECLARE @Var2 INT
DECLARE @NumGG INT

SET @T1 = 0
SET @T2 = 0
SET @T3 = 0
SET @T4 = 0
SET @T5 = 0


IF @Anno < 1900 OR @Anno > 2199
BEGIN
RAISERROR ('La procedura gestisce solo le date comprese tra il 1500 ed il 2199', 16, 1)
END 

IF @Anno >= 1900 AND @Anno <= 2099
BEGIN
SET @Var1 = 24
SET @Var2 = 5
END
IF @Anno >= 2100 AND @Anno <= 2199
BEGIN
SET @Var1 = 24
SET @Var2 = 6
END


SET @T1 = @Anno % 19
SET @T2 = @Anno % 4
SET @T3 = @Anno % 7
SET @T4 = ((16 * @T1) + @Var1) % 30
SET @T5 = ((2 * @T2) + (4 * @T3) + (6 * @T4) + @Var2) % 7

SET @NumGG = 22 + @T4 + @T5

IF @NumGG <= 31
BEGIN
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '03' + RIGHT('0' + CAST(@NumGG AS VARCHAR(2)), 2) AS DATETIME)
END ELSE
BEGIN
SET @NumGG = @NumGG - 31
SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '04' + RIGHT('0' + CAST(@NumGG AS VARCHAR(2)), 2) AS DATETIME)
END

RETURN(0)

Lascio a voi l'esercizio di realizzare la stessa procedura con altri linguaggi di programmazione...Buon divertimento!

 

 

   

Tutti i diritti riservati
Lorenzo Braidi 2003 - 2005