¿Cuando caerá la Semana Santa del año que viene?

Pues es algo que siempre he querido tener un algoritmo que me lo resuelva, pero como no he tenido la necesidad, no me he puesto con ello nunca. El caso es que me he topado con este artículo que me lo da hecho y, que se le va a hacer, no voy a reinventar la rueda, sino anotar aquí el enlace y copiarme el código de interés:
1: using System;
2: 
3: namespace JnSoftware.Calculos
4: {
5: 
6:     /// <summary>
7:     /// Cálculo de Semana Santa
8:     /// </summary>
9:     public class SemanaSanta
10:     {
11: 
12:         #region Campos 
13:         private int a;
14:         private int b;
15:         private int c;
16:         private int d;
17:         private int e;
18:         private DateTime pascuaResurreccion;
19: 
20:         private int anio;
21: 
22:         #endregion
23: 
24:         /// <summary>
25:         /// Constructor de la clase
26:         /// </summary>
27:         /// <param name="anio">Entero que representa el año del que 
28:         /// se quiere calcular la semana santa.</param>
29:         /// <exception cref="ArgumentOutOfRangeException">
30:         /// Se produce cuando se intenta calcular
31:         /// la semana santa de un año no contemplado.</exception>
32:         public SemanaSanta(int anio)
33:         {
34:             try
35:             {
36:                 this.anio = anio;
37:                 calculaDomingoPascua();
38:             }
39:             catch { throw; }
40:         }
41: 
42:         /// <summary>
43:         /// Cálculo del domingo de Pascua o domingo de Resurrección.
44:         /// </summary>
45:         private void calculaDomingoPascua()
46:         {
47:             ParConstantes p = getPar(anio);
48:             a = anio % 19;
49:             b = anio % 4;
50:             c = anio % 7;
51:             d = (19 * a + p.M) % 30;
52:             e = (2 * b + 4 * c + 6 * d + p.N) % 7;
53: 
54:             if (d + e < 10)
55:                 pascuaResurreccion = new DateTime(anio, 3, d + e + 22);
56:             else
57:                 pascuaResurreccion = new DateTime(anio, 4, d + e - 9);
58: 
59:             // Excepciones
60:             if (pascuaResurreccion == new DateTime(anio, 4, 26))
61:                 pascuaResurreccion = new DateTime(anio, 4, 19);
62: 
63:             if (pascuaResurreccion == new DateTime(anio, 4, 25) 
64:                     && d == 28 && e == 6 && a > 10)
65:                 pascuaResurreccion = new DateTime(anio, 4, 18);
66:         }
67: 
68:         #region Constantes cálculo
69:         private struct ParConstantes
70:         {
71:             public int M { get; set; }
72:             public int N { get; set; }
73:         }
74: 
75:         private ParConstantes getPar(int anio)
76:         {
77:             ParConstantes p = new ParConstantes();
78:             if (anio < 1583)
79:             {
80:                 throw
81:                     new ArgumentOutOfRangeException
82:                         ("El año deberá ser superior a 1583");
83:             }
84:             else if (anio < 1700) { p.M = 22; p.N = 2; }
85:             else if (anio < 1800) { p.M = 23; p.N = 3; }
86:             else if (anio < 1900) { p.M = 23; p.N = 4; }
87:             else if (anio < 2100) { p.M = 24; p.N = 5; }
88:             else if (anio < 2200) { p.M = 24; p.N = 6; }
89:             else if (anio < 2299) { p.M = 25; p.N = 0; }
90:             else
91:             {
92:                 throw
93:                     new ArgumentOutOfRangeException
94:                         ("El año deberá ser inferior a 2299");
95:             }
96:             return p;
97:         }
98:         #endregion
99: 
100:         #region Propiedades públicas
101: 
102:      
103: 
104:         public DateTime MiercolesCeniza
105:         {
106:             get { return SabadoSanto.AddDays(7 * -6 - 3); }
107:         }
108: 
109:         public DateTime ViernesDolores
110:         {
111:             get { return pascuaResurreccion.AddDays(-9); }
112:         }
113: 
114:         public DateTime DomingoRamos
115:         {
116:             get { return pascuaResurreccion.AddDays(-7); }
117:         }
118: 
119:         public DateTime JuevesSanto
120:         {
121:             get { return pascuaResurreccion.AddDays(-3); }
122:         }
123: 
124:         public DateTime ViernesSanto
125:         {
126:             get { return pascuaResurreccion.AddDays(-2); }
127:         }
128: 
129:         public DateTime SabadoSanto
130:         {
131:             get { return pascuaResurreccion.AddDays(-1); }
132:         }
133: 
134:         public DateTime DomingoResurreccion
135:         {
136:             get { return pascuaResurreccion; }
137:         }
138: 
139:         #endregion
140: 
141:     }
142: }


Para saber en qué se basan estos cálculos podéis googlear "tablas epactas semana santa", yo he encontrado un par de artículos interesantes sobre el orígen de estos cálculos. ¡Que curioso que, al final, la Iglesia base el día de la Semana Santa en el año lunar!



Saludos

Comentarios

Miguel ha dicho que…
Otro ejemplo de cálculo de las fiestas móviles:
http://www.elavefenix.net/ficheros/Calendario.zip

Entradas populares de este blog

Install NET Core 2.1 SDK on Rasapbian

Actualizar automáticamente la versión del ejecutable con el nº de build de Jenkins

Pasar parámetros dinámicos a Attributes