Implementation Notes
Moveable Feasts
Most moveable feasts are based on Easter. The Easter algorithm I use is an implementation of the formula devised by Zeller, which correctly generates Easter dates both before and after the Gregorian shift. After the Gregorian shift, Easter differs depending upon the locale you select. The "Eastern" locale uses the Orthodox method, which calculates Easter in the Julian calendar (as if the shift had never occurred). All other locales use the Western method, which not only takes the vernal equinox based on the Gregorian calendar, but also makes an adjustment to the lunar calendar used to determine the date of the full moon.
Stay tuned for additional locales that use different rules for Easter. For example, in the years after the original Gregorian shift, several Protestant countries used something known as the "improved" calendar, which sometimes had conflicting dates for Easter, and if I can come up with a formula to generate Victorine Easters (the method used by the Irish that Bede complains about in his History of the Englich Church), that too.
Note that while the calendar will calculate Easter for any date after 33 CE (the conventional date of Christ's death), for the early centuries of the Church, particularly before the Council of Nicaea (325 CE), this date is merely a convenient fiction. Even after Nicaea it took a long time for all churches to conform to the Alexandrian method of Easter calculation.
The database can also specify feasts that fall on a weekday n weeks before or after a fixed date (e.g., Advent = 4th Sunday before December 25), or the nth weekday of a month (e.g., Thanksgiving in the Episcopal calendar). As of
Version 2.0, the program can also find a weekday between two other dates, including two moveable dates, if necessary. Thus I can now support quite complicated rules, but currently I only have one of this type implemented: in the Roman Catholic locale, the rule for the Holy Name of Jesus is "the Sunday between the octave of the nativity (i.e., Jan 1) and Epiphany (Jan. 6), or if that is lacking, the 2nd of January."
Fixed Feasts
I have implemented a moderately lengthy list of feast days (mostly saints' days, but also including other commemorative days like the Invention of the Cross), but it could be much longer still. Fixed feasts appear on the same day and month every year, with one minor exception (see Not a Bug below).
I am, by training, a medievalist, so the feasts I list tend towards those that were celebrated in the Middle Ages. My initial list of feast days was taken from the Golden Legend, cross-referenced with the Oxford Dictionary of the Saints. With only a few exceptions, any saint that appears in both works is included, and I have also included a number of other saints (mostly of later date than the Golden Legend) that I felt were important.
Anyone who has ever tried to trace the veneration of saints in any detail knows that practices change over time and from region to region. The program filters feasts for year and locale, so for example you will not see Thomas Becket before the year his canonization (1173) or (in the Roman Catholic locale) Margaret of Antioch after her cult was suppressed by the Vatican (1969). These date filters also let me implement saints whose feasts change days at various points in time, but my implementation of these changes is not thorough. In general, if the Oxford Dictionary gives a clear date of the switch, I have implemented it, but not all of their entries are equally detailed. When the dictionary merely notes that a saint was formerly observed on another date, I have generally made the assumption that the change was in the 1969 revisions to the calendar. But a glance at the 1962 calendar will show that some of these saints actually moved earlier, as they are already found on their present dates in that calendar. I have yet to make an effort to track down the actual dates of these changes. More precise information would be welcome.
Most of the historical data about the Anglican rite churches I've taken from Hatchett.
The starting date of many of the early saints is somewhat vague, and I have balanced several different criteria. For later saints, I've gone with the date of formal canonization. For earlier saints I've used either the date of their death (or a little later when unknown), or when I had the information available, the first known appearance of their cult.
Locales
In version 1.1 I implemented locales, to account for the fact that the same feast is often celebrated on different days in different regions. Locales are hierarchical, and each child locale inherits the feasts of its parents. Switching between Eastern and Western locales will change the method of calculating Easter (after the Gregorian change in 1582—they are the same before that).
My first additional locale was the Sarum (Salisbury) calendar, a widespread Use in medieval England. In the latest version I've added all the feasts in the Episcopal (American) Book of Common Prayer (1979 version). Note that the Episcopal church observes days of comemoration for people who are not saints (indeed, they don't have saints in the Roman Catholic sense). Merely because I have set up a locale, you should by no means consider that I have systematically consulted all the relevant calendars. Also, because the earlier versions of this program did not use locales, there are still feasts that show up in all locales that really should be limited to narrower regions. The
Eastern locale is particularly scanty at the moment, but it's next on my list of locales to add. If anyone would care to send me a systematic list of feasts in any particular use I would be extremely grateful.
In many Eastern Orthodox churches, fixed feasts are still celebrated on their dates in the Julian (Old Style) calendar. As of version 1.3, the program can handle both Old Style and New Style dating. If you select the "Orthodox Old-Style" checkbox in the Options panel, feast days will be translated from their Julian dates before being displayed in the Gregorian calendar.
Feast-Type Filters
New to version 2.0, I now allow filtering of feasts by what kind of person or thing the day commemorates. For the most part these types are the characteristics of the saints that generally appear on calendars, e.g., "virgin" "martyr" "pope", etc. There are also types for commemoration of objects (e.g., the cross), events, etc. Some types are undifferentiated. "bishop" includes "archbishop", "deacon" includes "archdeacon", and most significantly, "religious" includes all those vowed to religious orders (monks, friars, etc.) as well as hermits.
These feast types are bound to the feast itself, not the locale-dependent rules, so characteristics that are specific to one church or another will be included no matter what locale you have selected. Thus Roman Catholic doctors of the church who are culted more widely will be called "doctor" in other locales as well (and for that matter, before the actual dates that they were declared doctors by Rome).
Precedence and Transference
Feasts vary in importance, but one major limitation of the program is that it does not calculate precedence rules. These rules sometimes require the omission or transference of a feast if it conflicts with a more important one. The rules, and indeed the relative importance of different feasts, vary over locale and time. It is possible I will add this feature in the future, if I can track down sufficient historical data about past rules.
Not a Bug
If you are sharp-eyed, you might notice that the feast for Matthias, on February 24 (until 1969 for Roman Catholics), appears on the 25th in leap years. This behavior is not a bug. Traditionally, the leap day is inserted before the 6th kalends of March (in Latin, the leap day was called the bissextus), i.e., February 24, which has the effect of pushing any fixed feasts that happen to be on that day one day later. So, for example, the 1962 Roman Missal says In anno bisextili mensis februarius est dierum 29, et festum Matthiae celebratur die 25 februarii...et bis dicitur Sexto Kalendtas, id est die 24 et die 25. If you have the Roman day count turned on, you will note it displays "vi kal. mar." for both the 24th and the 25th in leap years.
As of version 2.0 of the program, I've revised my rule handling so this behavior can change from locale to locale. The Episcopal church still observes Matthias on the 24th, but they do not change the date in leap years any more. I don't know when the practice actually ceased, but until I can dig up more authoritative information I have assumed that it was in the 1928 revision to the prayer book.
[Update: I was informed (by someone whose name I have misplaced, alas) that the change occurred in the 17th century, but the database hasn't been updated to reflect this.]
Details about the Code
I wrote my own Date class for this application. When I originally wrote the program, Java 1.1 was just being introduced, and the (now deprecated) Date class with 1.0 wasn't adequate. Even the Calendar classes with 1.1 didn't have everything that I needed. The class I use generates the correct dates even in odd cases (for example, if the change from the Julian to the Gregorian calendar spans a month or year boundary).
Suggestions and Corrections
I welcome suggestions for new feasts to add as well as corrections to the current database. I am particularly looking for additional information about changes in feast days and local variations in practice, which will help me implement further locales.
Version | Date | Changes |
---|---|---|
2.0 | Mar. 15, 1998 | Filter by feast type; Indictions; Span and in-span rules |
1.5 | Feb. 14 | Added Church of England days |
1.4 | Feb. 7 | Internal changes to reduce program size and load time. |
1.3 | Feb. 5 | Variable Gregorian conversion, Julian feast dates, etc. |
1.2 | Feb. 3 | Added Episcopal days of observance |
1.11 | Nov. 3, 1997 | Fixed bug in locale lookup routine |
1.10 | Oct. 31 | Locale support |
1.03 | Oct. 22 | Fixed bug in moveable feast rule-parsing. |
1.02 | Oct. 20 | Roman day counting |
1.01 | Oct. 19 | Added more saints |
1.00 | Oct. 15 | Base version |
Disclaimer
I have tried to make this program as accurate as I can, but I make no warranty of any sort about the correctness of the information here. Don't rely on it for anything critical.