A Historical Calendar Applet

I wrote this applet back in 1998 to answer a question that was bugging me while I was plotting out a historical novel (which perhaps I'll finish some day, if I ever have time): what would the calendar have looked like at a particular date in the distant past? This isn't just a matter of calculating Easter and the feasts like Pentecost that depend on it. Saints' days change over time as new ones come along and old ones fall out of favor or are moved. Also, different regions may celebrate the same saint on a different day. Rather than simply look up things for the particular place and time I was dealing with, I decided to create a general-purpose solution.

This applet works from a database of about 450 feast days, and will place them on the appropriate day and month depending on the year/region you select. In particular, it contains information about all the Vatican II revisions to the calendar, so for earlier dates, you will see the saints as they were celebrated traditionally. The default settings will automatically exclude saints that weren't celebrated in a particular year (e.g., because they hadn't been born yet).

If you had Java support enabled in your browser, this space would contain a historically accurate calendar, including Christian feast days appropriate for the time period and geographical locale you specify. The database of feasts includes many changes to observances over the years, and displays feasts as they were celebrated in the time you display.

If you need additional help using the applet, you can read the instructions. Before you send me any comments, you might also want to read the implementation notes.

Applet Instructions

This program generates a Christian ecclesiastical calendar for any year you select. It will calculate the dates for the moveable feasts based on Easter (Ash Wednesday, Pentecost, etc.), Advent, and many saint and other feast days. The calendar filters holidays by date and locale.

To navigate in the calendar, you can click on the buttons beneath the grid display, which will scroll one unit at a time. Alternately, you can select the month by pulling down the choice box, or the year by clicking on the year box and editing it to the desired year (you need to hit the "enter" key for the year to change in the calendar grid). The calendar will correctly display BCE dates, but because of the year filtering, no holidays will appear in the list box.

In general, saints who died before there was a formal process of canonization appear on the calendar sometime shortly after their deaths. For the earliest saints these dates are arbitrary and should not be regarded as indicating the historically attested appearance of a cult at this point in time. Later saints are added to the calendar at their date of canonization.

The default locale when the applet starts is "Western." This locale gives the traditional dates for many saints whose celebrations were moved or suppressed by the Roman Catholic church in the revisions of 1969. It is, in other words, a kind of convenient fiction that lets you see the old style of observance in a modern calendar.


  1. Western
    1. Roman Catholic
    2. English/Anglican
      1. Sarum (medieval)
      2. Church of England
      3. Episcopal (U.S.)
  2. Eastern Orthodox

Locales are organized in a hierarchy. As of the latest revision, the hierarchy was organized as shown in the list above. The feast filter enforces an inheritance rule: feasts defined in a parent locale are inherited by the child locale unless the child overrides that feast with different behavior. The "English" locale, for example, will show feasts common to the Anglican Rite churches (at the moment, I've only entered data for the Church of England and the Episcopal Church), or if you set the date before 1549, the date of Cranmer's prayer book, the medieval English church.

If you are in the "Roman Catholic" locale and set the date before 1970, you will notice that the saints move to their traditional days. The Anglican churches make comparable revisions beginning with the year 1980.

In the "Options" panel you can set how the calendar and feast days are to be displayed. If you want, you can select a different Gregorian conversion date from the standard one (October 15, 1582). I've pre-set a few conversion dates that I consider interesting or important, but you can also pick your own conversion date. If you want to see more detail about the conversion, I've prepared a fairly detailed table.

The "Filters" panel allows you to display only those categories of feasts you want to see. A feast can have multiple categories (e.g., virgin, martyr). Most types should be self-explanatory. The less obvious types are explained in the list below.

Filter-Type Notes

  • Deacon: Includes archdeacons and deaconesses.
  • Abbot: Includes abbesses.
  • Bishop: Includes archbishops.
  • Religious: Anyone vowed to a religious order. Includes monks, nuns, friars, and
    (for lack of a better place to put them) hermits.
  • Doctor: Doctor of the Church. Really only applies for the Roman Catholic church, but shown in all locales.
  • Christ-Centered: Commemorations of Jesus or events relating to him, e.g., Christmas, Easter, etc.
  • Object: Commemoration of a thing, e.g., the cross.
  • Other: People in not covered by other categories.

All I'm seeing is a gray box. What gives?

If you're seeing only a gray box instead of the applet, it's still loading. The program code is about 62k, and the database is another 20k. Thus depending on the state of the connection between your server and mine, it can take some time to download everything, or the load might be interrupted. If the load seems to be stalled, you might try reloading the page.

The applet runs but I don't see any holidays in the list box.

The feast-day data is downloaded after the applet starts. This can take some time, so the process runs in a separate thread while the graphics are initialized. If the internet connection is very slow, the applet will give up on trying to read the feast data after a certain amount of time (about a minute) and just run the basic application.

Implementation Notes

I welcome comments about this program. To forestall answering the same questions repeatedly, here are some notes about how I calculate the dates. If you have questions about how to use the applet, see the help file. I intend this calendar to have a certain degree of historical accuracy, but there are certain simplifications you should be aware of.

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.


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 History
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


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.