Zeller's congruence

From Wikipedia, the free encyclopedia - View original article

 
Jump to: navigation, search

Zeller's congruence is an algorithm devised by Christian Zeller to calculate the day of the week for any Julian or Gregorian calendar date. It can be considered to be based on the conversion between Julian day and the calendar date.

Formula[edit]

For the Gregorian calendar, Zeller's congruence is

h = \left(q + \left\lfloor\frac{13(m+1)}{5}\right\rfloor + K + \left\lfloor\frac{K}{4}\right\rfloor + \left\lfloor\frac{J}{4}\right\rfloor - 2J\right) \mod 7,

for the Julian calendar it is

h = \left(q + \left\lfloor\frac{13(m+1)}{5}\right\rfloor + K + \left\lfloor\frac{K}{4}\right\rfloor + 5 - J\right) \mod 7,

where

NOTE: In this algorithm January and February are counted as months 13 and 14 of the previous year. E.g. if it is February 2, 2010, the algorithm counts the date as the second day of the fourteenth month of 2009 (02/14/2009 in DD/MM/YYYY format)

For an ISO week date Day-of-Week d (1 = Monday to 7 = Sunday), use

d = ((h + 5) \mod 7) + 1

Implementation in software[edit]

The formulas rely on the mathematician's definition of modulo division, which means that −2 mod 7 is equal to positive 5. Unfortunately, the way most computer languages implement the remainder function, −2 mod 7 returns a result of -2. So, to implement Zeller's congruence on a computer, the formulas should be altered slightly to ensure a positive numerator. The simplest way to do this is to replace − 2J by + 5J and − J by + 6J. So the formulas become:

h = \left(q + \left\lfloor\frac{13(m+1)}{5}\right\rfloor + K + \left\lfloor\frac{K}{4}\right\rfloor + \left\lfloor\frac{J}{4}\right\rfloor + 5J\right) \mod 7,

for the Gregorian calendar, and

h = \left(q + \left\lfloor\frac{13(m+1)}{5}\right\rfloor + K + \left\lfloor\frac{K}{4}\right\rfloor + 5 + 6J\right) \mod 7,

for the Julian calendar.

One can readily see that, in a given year, March 1 (if that is a Saturday, then March 2) is a good test date; and that, in a given century, the best test year is that which is a multiple of 100.

Zeller used decimal arithmetic, and found it convenient to use J and K in representing the year. But when using a computer, it is simpler to handle the modified year Y, which is Y - 1 during January and February:

h = \left(q + \left\lfloor\frac{(m+1)26}{10}\right\rfloor + Y + \left\lfloor\frac{Y}{4}\right\rfloor + 6\left\lfloor\frac{Y}{100}\right\rfloor + \left\lfloor\frac{Y}{400}\right\rfloor\right) \mod 7,

for the Gregorian calendar, and

h = \left(q + \left\lfloor\frac{(m+1)26}{10}\right\rfloor + Y + \left\lfloor\frac{Y}{4}\right\rfloor + 5\right) \mod 7,

for the Julian calendar.

Analysis[edit]

These formulas are based on the observation that the day of the week progresses in a predictable manner based upon each subpart of that date. Each term within the formula is used to calculate the offset needed to obtain the correct day of the week.

For the Gregorian calendar, the various parts of this formula can therefore be understood as follows:

The reason that the formula differs for the Julian calendar is that this calendar does not have a separate rule for leap centuries and is offset from the Gregorian calendar by a fixed number of days each century.

Since the Gregorian calendar was adopted at different times in different regions of the world, the location of an event is significant in determining the correct day of the week for a date that occurred during this transition period.

The formulae can be used proleptically, but with care for years before Year 0. To accommodate this, one can add a sufficient multiple of 400 Gregorian or 28 Julian years.

Examples[edit]

For January 1, 2000, the date would be treated as the 13th month of 1999, so the values would be:

q = 1
m = 13
K = 99
J = 19

So the formula evaluates as (1 + 36 + 99 + 24 + 4 − 38) mod 7 = 126 mod 7 = 0 = Saturday

(The 36 comes from (13+1)*26/10 = 364/10, truncated to an integer.)

However, for March 1, 2000, the date is treated as the 3rd month of 2000, so the values become

q = 1
m = 3
K = 0
J = 20

so the formula evaluates as (1 + 10 + 0 + 0 + 5 − 40) mod 7 = −24 mod 7 = 4 = Wednesday

Other algorithms[edit]

There are other algorithms, and also one that uses Zeller's without the trailing mod 7 to arrive at day count, see Julian day.

Find day number of (to) an epoch having first day of year as Sunday (use any of a few algorithms) (these are numbered from 0). Then Sunday is first day of 1-7 days using:

  Modulus[daystoepoch, 7]+1 

See also[edit]

References[edit]

  1. ^ The every five months rule only applies to the twelve months of a year.

Each of these four similar imaged papers deals firstly with the day of the week and secondly with the date of Easter Sunday, for the Julian and Gregorian Calendars. The pages link to translations into English.

External links[edit]