Holidays related to Easter: Difference between revisions
(link to key documentation) |
(→Tcl: Added implementation) |
||
Line 173: | Line 173: | ||
2019 Easter: Sun 21 Apr, Ascension: Thu 30 May, Pentecost: Sun 9 Jun, Trinity: Sun 16 Jun, Corpus: Thu 20 Jun |
2019 Easter: Sun 21 Apr, Ascension: Thu 30 May, Pentecost: Sun 9 Jun, Trinity: Sun 16 Jun, Corpus: Thu 20 Jun |
||
2020 Easter: Sun 12 Apr, Ascension: Thu 21 May, Pentecost: Sun 31 May, Trinity: Sun 7 Jun, Corpus: Thu 11 Jun |
2020 Easter: Sun 12 Apr, Ascension: Thu 21 May, Pentecost: Sun 31 May, Trinity: Sun 7 Jun, Corpus: Thu 11 Jun |
||
</pre> |
|||
=={{header|Tcl}}== |
|||
<lang tcl>package require Tcl 8.5; # Advanced date handling engine |
|||
# Easter computation code from http://www.assa.org.au/edm.html |
|||
proc EasterDate year { |
|||
set FirstDig [expr {$year / 100}] |
|||
set Remain19 [expr {$year % 19}] |
|||
# calculate Paschal Full Moon date |
|||
set temp [expr {($FirstDig - 15)/2 + 202 - 11*$Remain19}] |
|||
if {$FirstDig in {21 24 25 27 28 29 30 31 32 34 35 38}} { |
|||
incr temp -1 |
|||
} elseif {$FirstDig in {33 36 37 39 40}} { |
|||
incr temp -2 |
|||
} |
|||
set temp [expr {$temp % 30}] |
|||
set tA [expr {$temp + 21}] |
|||
if {$temp == 29} {incr tA -1} |
|||
if {$temp == 28 && $Remain19 > 10} {incr tA -1} |
|||
# find the next Sunday |
|||
set tB [expr {($tA - 19) % 7}] |
|||
set tC [expr {(40 - $FirstDig) % 4}] |
|||
if {$tC == 3} {incr tC} |
|||
if {$tC > 1} {incr tC} |
|||
set temp [expr {$year % 100}] |
|||
set tD [expr {($temp + $temp/4) % 7}] |
|||
set tE [expr {((20 - $tB - $tC - $tD) % 7) + 1}] |
|||
set d [expr {$tA + $tE}] |
|||
# return the date |
|||
if {$d > 31} { |
|||
return [format "%02d April %04d" [expr {$d - 31}] $year] |
|||
} else { |
|||
return [format "%02d March %04d" $d $year] |
|||
} |
|||
} |
|||
# Use the Easter calculator to work out the data for the feasts |
|||
proc DateInfo year { |
|||
set fields [format %4d: $year] |
|||
set easter [clock scan [EasterDate $year] -format "%d %B %Y"] |
|||
foreach {name delta} { |
|||
Easter 0 |
|||
Ascension 39 |
|||
Pentecost 49 |
|||
Trinity 56 |
|||
Corpus 60 |
|||
} { |
|||
set when [clock add $easter $delta days] |
|||
lappend fields [clock format $when -format "${name}: %d %b"] |
|||
} |
|||
return [join $fields \t] |
|||
} |
|||
# Print the required info |
|||
puts "Christian holidays, related to Easter, for each centennial from 400 to 2100 CE:" |
|||
for {set year 400} {$year <= 2100} {incr year 100} { |
|||
puts [DateInfo $year] |
|||
} |
|||
puts "" |
|||
puts "Christian holidays, related to Easter, for years from 2010 to 2020 CE:" |
|||
for {set year 2010} {$year <= 2020} {incr year} { |
|||
puts [DateInfo $year] |
|||
}</lang> |
|||
Output: |
|||
<pre> |
|||
Christian holidays, related to Easter, for each centennial from 400 to 2100 CE: |
|||
400: Easter: 02 Apr Ascension: 11 May Pentecost: 21 May Trinity: 28 May Corpus: 01 Jun |
|||
500: Easter: 04 Apr Ascension: 13 May Pentecost: 23 May Trinity: 30 May Corpus: 03 Jun |
|||
600: Easter: 13 Apr Ascension: 22 May Pentecost: 01 Jun Trinity: 08 Jun Corpus: 12 Jun |
|||
700: Easter: 15 Apr Ascension: 24 May Pentecost: 03 Jun Trinity: 10 Jun Corpus: 14 Jun |
|||
800: Easter: 23 Apr Ascension: 01 Jun Pentecost: 11 Jun Trinity: 18 Jun Corpus: 22 Jun |
|||
900: Easter: 28 Mar Ascension: 06 May Pentecost: 16 May Trinity: 23 May Corpus: 27 May |
|||
1000: Easter: 30 Mar Ascension: 08 May Pentecost: 18 May Trinity: 25 May Corpus: 29 May |
|||
1100: Easter: 08 Apr Ascension: 17 May Pentecost: 27 May Trinity: 03 Jun Corpus: 07 Jun |
|||
1200: Easter: 09 Apr Ascension: 18 May Pentecost: 28 May Trinity: 04 Jun Corpus: 08 Jun |
|||
1300: Easter: 18 Apr Ascension: 27 May Pentecost: 06 Jun Trinity: 13 Jun Corpus: 17 Jun |
|||
1400: Easter: 20 Apr Ascension: 29 May Pentecost: 08 Jun Trinity: 15 Jun Corpus: 19 Jun |
|||
1500: Easter: 01 Apr Ascension: 10 May Pentecost: 20 May Trinity: 27 May Corpus: 31 May |
|||
1600: Easter: 02 Apr Ascension: 11 May Pentecost: 21 May Trinity: 28 May Corpus: 01 Jun |
|||
1700: Easter: 11 Apr Ascension: 20 May Pentecost: 30 May Trinity: 06 Jun Corpus: 10 Jun |
|||
1800: Easter: 13 Apr Ascension: 22 May Pentecost: 01 Jun Trinity: 08 Jun Corpus: 12 Jun |
|||
1900: Easter: 15 Apr Ascension: 24 May Pentecost: 03 Jun Trinity: 10 Jun Corpus: 14 Jun |
|||
2000: Easter: 23 Apr Ascension: 01 Jun Pentecost: 11 Jun Trinity: 18 Jun Corpus: 22 Jun |
|||
2100: Easter: 28 Mar Ascension: 06 May Pentecost: 16 May Trinity: 23 May Corpus: 27 May |
|||
Christian holidays, related to Easter, for years from 2010 to 2020 CE: |
|||
2010: Easter: 04 Apr Ascension: 13 May Pentecost: 23 May Trinity: 30 May Corpus: 03 Jun |
|||
2011: Easter: 24 Apr Ascension: 02 Jun Pentecost: 12 Jun Trinity: 19 Jun Corpus: 23 Jun |
|||
2012: Easter: 08 Apr Ascension: 17 May Pentecost: 27 May Trinity: 03 Jun Corpus: 07 Jun |
|||
2013: Easter: 31 Mar Ascension: 09 May Pentecost: 19 May Trinity: 26 May Corpus: 30 May |
|||
2014: Easter: 20 Apr Ascension: 29 May Pentecost: 08 Jun Trinity: 15 Jun Corpus: 19 Jun |
|||
2015: Easter: 05 Apr Ascension: 14 May Pentecost: 24 May Trinity: 31 May Corpus: 04 Jun |
|||
2016: Easter: 27 Mar Ascension: 05 May Pentecost: 15 May Trinity: 22 May Corpus: 26 May |
|||
2017: Easter: 16 Apr Ascension: 25 May Pentecost: 04 Jun Trinity: 11 Jun Corpus: 15 Jun |
|||
2018: Easter: 01 Apr Ascension: 10 May Pentecost: 20 May Trinity: 27 May Corpus: 31 May |
|||
2019: Easter: 21 Apr Ascension: 30 May Pentecost: 09 Jun Trinity: 16 Jun Corpus: 20 Jun |
|||
2020: Easter: 12 Apr Ascension: 21 May Pentecost: 31 May Trinity: 07 Jun Corpus: 11 Jun |
|||
</pre> |
</pre> |
Revision as of 10:25, 30 June 2010
You are encouraged to solve this task according to the task description, using any language you may know.
Calculate the date of Easter, Ascension Thursday, Pentecost, Trinity Sunday & Corpus Christi feast.
As the example calculate for the first year of each century from 400 to 2100 CE and also for years 2010 to 2020 CE.
Note: From year 325 CE on, Easter Sunday is the Sunday following the first Ecclesiastical full moon not earlier than the equinox date in 325 — 21 March. The Ecclesiastical full moon does not always correspond to the astronomical full moon since in 325 fine details of Lunar dynamics were not yet fully understood.
ALGOL 68
Note: Base code specimen extracted from Algol 68 Genie Documentation Part III - Example a68g programs. <lang algol68>MODE YEAR = INT, MONTH = INT, WEEK = INT, DAY = INT;
MODE DATE = STRUCT(
YEAR year, #DAY year day, # MONTH month, DAY month day,# WEEK week, #DAY week day);
FORMAT mon fmt = $c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec")$,
FORMAT week day fmt = $c("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri")$;
PROC year days = (YEAR year)DAY: # Ignore 1752 CE for the moment #
( month days(year, 2) = 28 | 365 | 366 );
PROC month days = (YEAR year, MONTH month) INT:
( month | 31, 28 + ABS(year MOD 4 NE 0 OR year MOD 400 EQ 0), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
INT year months = 12; INT week days = 7; # France 1793 to 1805 had 10 day weeks! #
OP + = (DATE in date, DAY in days)DATE:
BEGIN # todo: eliminate loops, handle year <= 1752 # DAY days := in days; DATE date := in date; # Normalize the days to be less then 1 year # WHILE days < 0 DO year OF date -:= 1; days +:= year days(year OF date) OD; WHILE days > year days(year OF date) DO days -:= year days(year OF date); year OF date +:= 1 OD; month day OF date +:= days; # Normalize the days to be the same month # WHILE month day OF date > month days(year OF date, month OF date) DO month day OF date -:= month days(year OF date, month OF date); month OF date +:= 1; IF month OF date > year months THEN month OF date -:= year months; year OF date +:= 1 FI OD; week day OF date := week day(date); date END;
OP +:= = (REF DATE date, DAY in days)DATE:
date := date + in days;
PROC easter = (YEAR year)DATE:
BEGIN COMMENT Easter date algorithm from J.M. Oudin (1940), reprinted in: P.K. Seidelmann ed., "Explanatory Supplement to the Astronomical Almanac" [1992] (Chapter 12, "Calendars", by L.E. Doggett) COMMENT DATE date; year OF date := year; INT c = year % 100, n = year %* 19; INT i := (c - c % 4 - (c - (c - 17) % 25) % 3 + 19 * n + 15) %* 30; i -:= (i % 28) * (1 - (i % 28) * (29 % (i + 1)) * ((21 - n) % 11)); INT l = i - (year + year % 4 + i + 2 - c + c % 4) %* 7; month OF date := 3 + (l + 40) % 44; month day OF date := l + 28 - 31 * (month OF date % 4); week day OF date := week day(date); date END;
PROC week day = (DATE date)DAY:
# Zeller’s Congruence algorithm from 1887. # BEGIN INT year := year OF date, month := month OF date, month day := month day OF date, c; (month <= 2 | (month +:= 12, year -:= 1)); c := year OVER 100; year %*:= 100; 1 + (month day + ((month + 1) * 26) OVER 10 + year + year OVER 4 + c OVER 4 - 2 * c) %* 7 END;
FORMAT wdmdm fmt = $f(week day fmt)z-dxf(mon fmt)$,
MODE EASTERRELATED = STRUCT(DATE easter, ascension, pentecost, trinity, corpus christi);
PROC easter related init = (YEAR year)EASTERRELATED: BEGIN
DATE date; EASTERRELATED holidays;
- Easter date, always a Sunday. #
easter OF holidays := date := easter(year);
- Ascension day is 39 days after Easter.#
ascension OF holidays := ( date +:= 39);
- Pentecost is 10 days after Ascension day.#
pentecost OF holidays := date +:= 10;
- Trinity is 7 days after Pentecost.#
trinity OF holidays := date +:= 7;
- Corpus Christi is 4 days after Trinity.#
corpus christi OF holidays := date +:= 4; holidays
END;
- Note: Y10K bug here... :-) #
FORMAT easter related fmt = $g(-4)" Easter: "f(wdmdm fmt) ", Ascension: "f(wdmdm fmt)
", Pentecost: "f(wdmdm fmt) ", Trinity: "f(wdmdm fmt)", Corpus: "f(wdmdm fmt)$;
PROC easter related print = (YEAR year)VOID: BEGIN
EASTERRELATED holidays = easter related init(year); PROC wdmdm = (DATE date)STRUCT(DAY week day, DAY month day, MONTH month): (week day OF date, month day OF date, month OF date); printf((easter related fmt, year, wdmdm(easter OF holidays), wdmdm(ascension OF holidays), wdmdm(pentecost OF holidays), wdmdm(trinity OF holidays), wdmdm(corpus christi OF holidays), $l$))
END;
printf (($"Christian holidays, related to Easter, for each centennial from 400 to 2100 CE:"l$)); FOR year FROM 400 BY 100 TO 2100 DO easter related print(year) OD;
printf (($l"Christian holidays, related to Easter, for years from 2010 to 2020 CE:"l$)); FOR year FROM 2010 TO 2020 DO easter related print(year) OD</lang> Output:
Christian holidays, related to Easter, for each centennial from 400 to 2100 CE: 400 Easter: Sun 2 Apr, Ascension: Thu 11 May, Pentecost: Sun 21 May, Trinity: Sun 28 May, Corpus: Thu 1 Jun 500 Easter: Sun 4 Apr, Ascension: Thu 13 May, Pentecost: Sun 23 May, Trinity: Sun 30 May, Corpus: Thu 3 Jun 600 Easter: Sun 13 Apr, Ascension: Thu 22 May, Pentecost: Sun 1 Jun, Trinity: Sun 8 Jun, Corpus: Thu 12 Jun 700 Easter: Sun 15 Apr, Ascension: Thu 24 May, Pentecost: Sun 3 Jun, Trinity: Sun 10 Jun, Corpus: Thu 14 Jun 800 Easter: Sun 23 Apr, Ascension: Thu 1 Jun, Pentecost: Sun 11 Jun, Trinity: Sun 18 Jun, Corpus: Thu 22 Jun 900 Easter: Sun 28 Mar, Ascension: Thu 6 May, Pentecost: Sun 16 May, Trinity: Sun 23 May, Corpus: Thu 27 May 1000 Easter: Sun 30 Mar, Ascension: Thu 8 May, Pentecost: Sun 18 May, Trinity: Sun 25 May, Corpus: Thu 29 May 1100 Easter: Sun 8 Apr, Ascension: Thu 17 May, Pentecost: Sun 27 May, Trinity: Sun 3 Jun, Corpus: Thu 7 Jun 1200 Easter: Sun 9 Apr, Ascension: Thu 18 May, Pentecost: Sun 28 May, Trinity: Sun 4 Jun, Corpus: Thu 8 Jun 1300 Easter: Sun 18 Apr, Ascension: Thu 27 May, Pentecost: Sun 6 Jun, Trinity: Sun 13 Jun, Corpus: Thu 17 Jun 1400 Easter: Sun 20 Apr, Ascension: Thu 29 May, Pentecost: Sun 8 Jun, Trinity: Sun 15 Jun, Corpus: Thu 19 Jun 1500 Easter: Sun 1 Apr, Ascension: Thu 10 May, Pentecost: Sun 20 May, Trinity: Sun 27 May, Corpus: Thu 31 May 1600 Easter: Sun 2 Apr, Ascension: Thu 11 May, Pentecost: Sun 21 May, Trinity: Sun 28 May, Corpus: Thu 1 Jun 1700 Easter: Sun 11 Apr, Ascension: Thu 20 May, Pentecost: Sun 30 May, Trinity: Sun 6 Jun, Corpus: Thu 10 Jun 1800 Easter: Sun 13 Apr, Ascension: Thu 22 May, Pentecost: Sun 1 Jun, Trinity: Sun 8 Jun, Corpus: Thu 12 Jun 1900 Easter: Sun 15 Apr, Ascension: Thu 24 May, Pentecost: Sun 3 Jun, Trinity: Sun 10 Jun, Corpus: Thu 14 Jun 2000 Easter: Sun 23 Apr, Ascension: Thu 1 Jun, Pentecost: Sun 11 Jun, Trinity: Sun 18 Jun, Corpus: Thu 22 Jun 2100 Easter: Sun 28 Mar, Ascension: Thu 6 May, Pentecost: Sun 16 May, Trinity: Sun 23 May, Corpus: Thu 27 May Christian holidays, related to Easter, for years from 2010 to 2020 CE: 2010 Easter: Sun 4 Apr, Ascension: Thu 13 May, Pentecost: Sun 23 May, Trinity: Sun 30 May, Corpus: Thu 3 Jun 2011 Easter: Sun 24 Apr, Ascension: Thu 2 Jun, Pentecost: Sun 12 Jun, Trinity: Sun 19 Jun, Corpus: Thu 23 Jun 2012 Easter: Sun 8 Apr, Ascension: Thu 17 May, Pentecost: Sun 27 May, Trinity: Sun 3 Jun, Corpus: Thu 7 Jun 2013 Easter: Sun 31 Mar, Ascension: Thu 9 May, Pentecost: Sun 19 May, Trinity: Sun 26 May, Corpus: Thu 30 May 2014 Easter: Sun 20 Apr, Ascension: Thu 29 May, Pentecost: Sun 8 Jun, Trinity: Sun 15 Jun, Corpus: Thu 19 Jun 2015 Easter: Sun 5 Apr, Ascension: Thu 14 May, Pentecost: Sun 24 May, Trinity: Sun 31 May, Corpus: Thu 4 Jun 2016 Easter: Sun 27 Mar, Ascension: Thu 5 May, Pentecost: Sun 15 May, Trinity: Sun 22 May, Corpus: Thu 26 May 2017 Easter: Sun 16 Apr, Ascension: Thu 25 May, Pentecost: Sun 4 Jun, Trinity: Sun 11 Jun, Corpus: Thu 15 Jun 2018 Easter: Sun 1 Apr, Ascension: Thu 10 May, Pentecost: Sun 20 May, Trinity: Sun 27 May, Corpus: Thu 31 May 2019 Easter: Sun 21 Apr, Ascension: Thu 30 May, Pentecost: Sun 9 Jun, Trinity: Sun 16 Jun, Corpus: Thu 20 Jun 2020 Easter: Sun 12 Apr, Ascension: Thu 21 May, Pentecost: Sun 31 May, Trinity: Sun 7 Jun, Corpus: Thu 11 Jun
Tcl
<lang tcl>package require Tcl 8.5; # Advanced date handling engine
- Easter computation code from http://www.assa.org.au/edm.html
proc EasterDate year {
set FirstDig [expr {$year / 100}] set Remain19 [expr {$year % 19}]
# calculate Paschal Full Moon date set temp [expr {($FirstDig - 15)/2 + 202 - 11*$Remain19}] if {$FirstDig in {21 24 25 27 28 29 30 31 32 34 35 38}} {
incr temp -1
} elseif {$FirstDig in {33 36 37 39 40}} {
incr temp -2
} set temp [expr {$temp % 30}]
set tA [expr {$temp + 21}] if {$temp == 29} {incr tA -1} if {$temp == 28 && $Remain19 > 10} {incr tA -1}
# find the next Sunday set tB [expr {($tA - 19) % 7}]
set tC [expr {(40 - $FirstDig) % 4}] if {$tC == 3} {incr tC} if {$tC > 1} {incr tC}
set temp [expr {$year % 100}] set tD [expr {($temp + $temp/4) % 7}]
set tE [expr {((20 - $tB - $tC - $tD) % 7) + 1}] set d [expr {$tA + $tE}]
# return the date if {$d > 31} {
return [format "%02d April %04d" [expr {$d - 31}] $year]
} else {
return [format "%02d March %04d" $d $year]
}
}
- Use the Easter calculator to work out the data for the feasts
proc DateInfo year {
set fields [format %4d: $year] set easter [clock scan [EasterDate $year] -format "%d %B %Y"] foreach {name delta} {
Easter 0 Ascension 39 Pentecost 49 Trinity 56 Corpus 60
} {
set when [clock add $easter $delta days] lappend fields [clock format $when -format "${name}: %d %b"]
} return [join $fields \t]
}
- Print the required info
puts "Christian holidays, related to Easter, for each centennial from 400 to 2100 CE:" for {set year 400} {$year <= 2100} {incr year 100} {
puts [DateInfo $year]
} puts "" puts "Christian holidays, related to Easter, for years from 2010 to 2020 CE:" for {set year 2010} {$year <= 2020} {incr year} {
puts [DateInfo $year]
}</lang> Output:
Christian holidays, related to Easter, for each centennial from 400 to 2100 CE: 400: Easter: 02 Apr Ascension: 11 May Pentecost: 21 May Trinity: 28 May Corpus: 01 Jun 500: Easter: 04 Apr Ascension: 13 May Pentecost: 23 May Trinity: 30 May Corpus: 03 Jun 600: Easter: 13 Apr Ascension: 22 May Pentecost: 01 Jun Trinity: 08 Jun Corpus: 12 Jun 700: Easter: 15 Apr Ascension: 24 May Pentecost: 03 Jun Trinity: 10 Jun Corpus: 14 Jun 800: Easter: 23 Apr Ascension: 01 Jun Pentecost: 11 Jun Trinity: 18 Jun Corpus: 22 Jun 900: Easter: 28 Mar Ascension: 06 May Pentecost: 16 May Trinity: 23 May Corpus: 27 May 1000: Easter: 30 Mar Ascension: 08 May Pentecost: 18 May Trinity: 25 May Corpus: 29 May 1100: Easter: 08 Apr Ascension: 17 May Pentecost: 27 May Trinity: 03 Jun Corpus: 07 Jun 1200: Easter: 09 Apr Ascension: 18 May Pentecost: 28 May Trinity: 04 Jun Corpus: 08 Jun 1300: Easter: 18 Apr Ascension: 27 May Pentecost: 06 Jun Trinity: 13 Jun Corpus: 17 Jun 1400: Easter: 20 Apr Ascension: 29 May Pentecost: 08 Jun Trinity: 15 Jun Corpus: 19 Jun 1500: Easter: 01 Apr Ascension: 10 May Pentecost: 20 May Trinity: 27 May Corpus: 31 May 1600: Easter: 02 Apr Ascension: 11 May Pentecost: 21 May Trinity: 28 May Corpus: 01 Jun 1700: Easter: 11 Apr Ascension: 20 May Pentecost: 30 May Trinity: 06 Jun Corpus: 10 Jun 1800: Easter: 13 Apr Ascension: 22 May Pentecost: 01 Jun Trinity: 08 Jun Corpus: 12 Jun 1900: Easter: 15 Apr Ascension: 24 May Pentecost: 03 Jun Trinity: 10 Jun Corpus: 14 Jun 2000: Easter: 23 Apr Ascension: 01 Jun Pentecost: 11 Jun Trinity: 18 Jun Corpus: 22 Jun 2100: Easter: 28 Mar Ascension: 06 May Pentecost: 16 May Trinity: 23 May Corpus: 27 May Christian holidays, related to Easter, for years from 2010 to 2020 CE: 2010: Easter: 04 Apr Ascension: 13 May Pentecost: 23 May Trinity: 30 May Corpus: 03 Jun 2011: Easter: 24 Apr Ascension: 02 Jun Pentecost: 12 Jun Trinity: 19 Jun Corpus: 23 Jun 2012: Easter: 08 Apr Ascension: 17 May Pentecost: 27 May Trinity: 03 Jun Corpus: 07 Jun 2013: Easter: 31 Mar Ascension: 09 May Pentecost: 19 May Trinity: 26 May Corpus: 30 May 2014: Easter: 20 Apr Ascension: 29 May Pentecost: 08 Jun Trinity: 15 Jun Corpus: 19 Jun 2015: Easter: 05 Apr Ascension: 14 May Pentecost: 24 May Trinity: 31 May Corpus: 04 Jun 2016: Easter: 27 Mar Ascension: 05 May Pentecost: 15 May Trinity: 22 May Corpus: 26 May 2017: Easter: 16 Apr Ascension: 25 May Pentecost: 04 Jun Trinity: 11 Jun Corpus: 15 Jun 2018: Easter: 01 Apr Ascension: 10 May Pentecost: 20 May Trinity: 27 May Corpus: 31 May 2019: Easter: 21 Apr Ascension: 30 May Pentecost: 09 Jun Trinity: 16 Jun Corpus: 20 Jun 2020: Easter: 12 Apr Ascension: 21 May Pentecost: 31 May Trinity: 07 Jun Corpus: 11 Jun