mirror of
https://github.com/Luzifer/go-holidays.git
synced 2024-12-26 13:51:18 +00:00
43 lines
1.4 KiB
Go
43 lines
1.4 KiB
Go
|
package holidays
|
|||
|
|
|||
|
import "time"
|
|||
|
|
|||
|
func GregorianEasterSunday(year int) time.Time {
|
|||
|
X := year
|
|||
|
|
|||
|
// Comments from german Wikipedia: https://de.wikipedia.org/wiki/Osterzyklus
|
|||
|
|
|||
|
// 1. die Säkularzahl: K = X div 100
|
|||
|
K := X / 100
|
|||
|
// 2. die säkulare Mondschaltung: M = 15 + (3K + 3) div 4 − (8K + 13) div 25
|
|||
|
M := 15 + (3*K+3)/4 - (8*K+13)/25
|
|||
|
// 3. die säkulare Sonnenschaltung: S = 2 − (3K + 3) div 4
|
|||
|
S := 2 - (3*K+3)/4
|
|||
|
// 4. den Mondparameter: A = X mod 19
|
|||
|
A := X % 19
|
|||
|
// 5. den Keim für den ersten Frühlingsvollmond: D = (19A + M) mod 30
|
|||
|
D := (19*A + M) % 30
|
|||
|
// 6. die kalendarische Korrekturgröße: R = D div 29 + (D div 28 − D div 29) (A div 11)
|
|||
|
R := D/29 + (D/28-D/29)*(A/11)
|
|||
|
// 7. die Ostergrenze: OG = 21 + D − R
|
|||
|
OG := 21 + D - R
|
|||
|
// 8. den ersten Sonntag im März: SZ = 7 − (X + X div 4 + S) mod 7
|
|||
|
SZ := 7 - (X+X/4+S)%7
|
|||
|
// 9. die Entfernung des Ostersonntags von der
|
|||
|
// Ostergrenze (Osterentfernung in Tagen): OE = 7 − (OG − SZ) mod 7
|
|||
|
OE := 7 - (OG-SZ)%7
|
|||
|
// 10. das Datum des Ostersonntags als Märzdatum
|
|||
|
// (32. März = 1. April usw.): OS = OG + OE
|
|||
|
OS := OG + OE
|
|||
|
|
|||
|
var month int = 3 // March
|
|||
|
var day int = OS
|
|||
|
|
|||
|
if day > 31 {
|
|||
|
day = day % 31
|
|||
|
month++
|
|||
|
}
|
|||
|
|
|||
|
return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.Local)
|
|||
|
}
|