Determination of the day of the week


The determination of the day of the week for any date may be performed with a variety of algorithms. In addition, perpetual calendars require no calculation by the user, and are essentially lookup tables.
A typical application is to calculate the day of the week on which someone was born or a specific event occurred.

Concepts

In numerical calculation, the days of the week are represented as weekday numbers. If Monday is the first day of the week, the days may be coded 1 to 7, for Monday through Sunday, as is practiced in ISO 8601. The day designated with 7 may also be counted as 0, by applying the arithmetic modulo 7, which calculates the remainder of a number after division by 7. Thus, the number 7 is treated as 0, 8 as 1, 9 as 2, 18 as 4 and so on. If Sunday is counted as day 1, then 7 days later is also a Sunday, and day 18 is the same as day 4, which is a Wednesday since this falls three days after Sunday.
StandardMondayTuesdayWednesdayThursdayFridaySaturdaySundayUsage examples
ISO 86011234567%_ISODOWI%, %@ISODOWI% ; DAYOFWEEK
0123456
2345671%NDAY OF WEEK% ; %_DOWI%, %@DOWI%
1234560HP financial calculators

The basic approach of nearly all of the methods to calculate the day of the week begins by starting from an 'anchor date': a known pair, determining the number of days between the known day and the day that you are trying to determine, and using arithmetic modulo 7 to find a new numerical day of the week.
One standard approach is to look up the value of the first day of the week of a given century, look up an adjustment for the month, calculate the number of leap years since the start of the century, and then add these together along with the number of years since the start of the century, and the day number of the month. Eventually, one ends up with a day-count to which one applies modulo 7 to determine the day of the week of the date.
Some methods do all the additions first and then cast out sevens, whereas others cast them out at each step, as in Lewis Carroll's method. Either way is quite viable: the former is easier for calculators and computer programs, the latter for mental calculation. None of the methods given here perform range checks, so unreasonable dates will produce erroneous results.

Corresponding days

Every seventh day in a month has the same name as the previous:
Day of
the month
00 07 14 21 280
01 08 15 22 291
02 09 16 23 302
03 10 17 24 313
04 11 18 254
05 12 19 265
06 13 20 276

Corresponding months

"Corresponding months" are those months within the calendar year that start on the same day of the week. For example, September and December correspond, because September 1 falls on the same day as December 1. Months can only correspond if the number of days between their first days is divisible by 7, or in other words, if their first days are a whole number of weeks apart. For example, February of a common year corresponds to March because February has 28 days, a number divisible by 7, 28 days being exactly four weeks.
In a leap year, January and February correspond to different months than in a common year, since adding February 29 means each subsequent month starts a day later.
Corresponding months are as shown below.
Common years
Leap years
All years
In the months table below, corresponding months have the same number, a fact which follows directly from the definition.

Corresponding years

There are seven possible days that a year can start on, and leap years will alter the day of the week after February 29. This means that there are 14 configurations that a year can have. All the configurations can be referenced by a dominical letter, but as February 29 has no letter allocated to it a leap year has two dominical letters, one for January and February and the other for March to December.
For example, 2019 was a common year starting on Tuesday, indicating that the year as a whole corresponded to the 2013 calendar year. On the other hand, 2020 is a leap year starting on Wednesday which will on the whole correspond to the 1992 calendar year; specifically, its first 2 months will correspond to those of the 2014 calendar year, while, due to the 2020 leap day, its subsequent 10 months will correspond to the 2015 calendar year.
Moreover:
For details see the table below.
Year of the
century mod 28
00 06 12 17 230
01 07 12 18 241
02 08 13 19 242
03 08 14 20 253
04 09 15 20 264
04 10 16 21 275
05 11 16 22 006

Notes:
Julian century
mod 700
Gregorian century
mod 400
Day
400: 1100 1800...300: 1500 1900...Sun
300: 1000 1700...Mon
200 0900 1600...200: 1800 2200...Tue
100 0800 1500...Wed
700: 1400 2100...100: 1700 2100...Thu
600: 1300 2000...Fri
500: 1200 1900...000: 1600 2000...Sat

"Year 000" is, in normal chronology, the year 1 BC. In astronomical year numbering the year 0 comes between 1 BC and AD 1. In the proleptic Julian calendar,, 1 BC starts on Thursday. In the proleptic Gregorian calendar,, 1 BC starts on Saturday.

Tabular methods to calculate the day of the week

Complete table: Julian and Gregorian calendars

For Julian dates before 1300 and after 1999 the year in the table which differs by an exact multiple of 700 years should be used. For Gregorian dates after 2299, the year in the table which differs by an exact multiple of 400 years should be used. The values "" through "" indicate the remainder when the Hundreds value is divided by 7 and 4 respectively, indicating how the series extend in either direction. Both Julian and Gregorian values are shown 1500-1999 for convenience. Bold figures denote leap year. If a year ends in 00 and its hundreds are in bold it is a leap year. Thus 19 indicates that 1900 is not a Gregorian leap year,. 20 indicates that 2000 is a leap year. Use Jan and Feb only in leap years.
For determination of the day of the week
The formula is w = mod 7.

Revised Julian calendar

Note that the date in the Revised Julian and Gregorian calendars is the same from 14 October 1923 to 28 February AD 2800 inclusive and that for large years it may be possible to subtract 6300 or a multiple thereof before starting so as to reach a year which is within or closer to the table.
To look up the weekday of any date for any year using the table, subtract 100 from the year, divide the difference by 100, multiply the resulting quotient by seven and divide the product by nine. Note the quotient. Enter the table with the Julian year, and just before the final division add 50 and subtract the quotient noted above.
Example: What is the day of the week of 27 January 8315?
8315-6300=2015, 2015-100=1915, 1915/100=19 remainder 15, 19x7=133, 133/9=14 remainder 7. 2015 is 700 years ahead of 1315, so 1315 is used. From table: for hundreds : 6. For remaining digits : 4. For month : 0. For date : 27. 6+4+0+27+50-14=73. 73/7=10 remainder 3. Day of week = Tuesday.

Dominical Letter

To find the Dominical Letter, calculate the day of the week for either 1 January or 1 October. If it is Sunday, the Sunday Letter is A, if Saturday B, and similarly backwards through the week and forwards through the alphabet to Monday, which is G.
Leap years have two Sunday Letters, so for January and February calculate the day of the week for 1 January and for March to December calculate the day of the week for 1 October.
Leap years are all years which divide exactly by four with the following exceptions:
In the Gregorian calendar - all years which divide exactly by 100.
In the Revised Julian calendar - all years which divide exactly by 100.

The "doomsday"

This is an artefact of recreational mathematics. See doomsday rule for an explanation.

Check the result

Use this table for finding the day of the week without any calculations.
Examples:
December is in row F and 26 is in column E, so the letter for the date is C located in row F and column E. 93 is in row D and the letter C in the year row is located in column G. 18 is in row C and the letter in the century row and column G is B, so the day of the week is Tuesday.
October 13 is a F day. The letter F in the year row is located in column G. The letter in the century row and column G is E, so the day of the week is Friday.
January 1 corresponds to G, G in the year row corresponds to F in the century row, and F corresponds to Saturday.
A pithy formula for the method: "Date letter, letter is in year row for the letter in century row, and for the day, the letter become weekday ".
The Sunday Letter method
Each day of the year has a letter allocated to it in the recurring sequence ABCDEFG. The series begins with A on 1 January and continues to A again on 31 December. The Sunday letter is the one which stands against all the Sundays in the year. Since 29 February has no letter, this means that the Sunday Letter for March to December is one step back in the sequence compared to that for January and February. The letter for any date will be found where the row containing the month at the left of the "Latin square" meets the column containing the date above the "Latin square". The Sunday letter will be found where the column containing the century meets the row containing the year's last two digits to the right of the "Latin square". For a leap year, the Sunday letter thus found is the one which applies to March to December.
So, for example, to find the weekday of 16 June 2020:
Column "20" meets row "20" at "D". Row "June" meets column "16" at "F". As F is two letters on from D, so the weekday is two days on from Sunday, i.e. Tuesday.

Mathematical algorithms

Gauss's algorithm

In a handwritten note in a collection of astronomical tables, Carl Friedrich Gauss described a method for calculating the day of the week for 1 January in any given year. He never published it. It was finally included in his collected works in 1927.
Gauss' method was applicable to the Gregorian calendar. He numbered the weekdays from 0 to 6 starting with Sunday. He defined the following operation:
The weekday of 1 January in year number is
or
from which a method for the Julian calendar can be derived
or
where is the remainder after division of by, or modulo, and + 100 =.
For year number 2000, - 1 = 1999, - 1 = 99 and = 19, the weekday of 1 January is
The weekday of the last day in year number - 1 or 0 January in year number is
The weekday of 0 or 1 January in year number is
In order to determine the week day of an arbitrary date, we will use the following lookup table.
Note: minus 1 if is 11 or 12 and plus 1 if less than 11 in a leap year.
The day of the week for any day in year number A is
or
where is the day of the month and - 1 for Jan or Feb.
The weekdays for 30 April 1777 and 23 February 1855 are
and
This formula was also converted into graphical and tabular methods for calculating any day of the week by Kraitchik and Schwerdtfeger.

Disparate variation

Another variation of the above algorithm likewise works with no lookup tables. A slight disadvantage is the unusual month and year counting convention. The formula is
where
For example, January 1, 2000.
Note: The first is only for a 00 leap year and the second is for any 00 years.
The term gives the values of months:
Months
January0
February3
March2
April5
May0
June3
July5
August1
September4
October6
November2
December4

The term gives the values of years:
mod 28
01 07 12 18 --1
02-13 19 242
03 08 14-253
-- 09 15 20 264
04 10-21 275
05 11 16 22 --6
06-17 23 000

The term gives the values of centuries:
mod 4
15
23
31
00

Now from the general formula: ; January 1, 2000 can be recalculated as follows:

Zeller's algorithm

In Zeller's algorithm, the months are numbered from 3 for March to 14 for February. The year is assumed to begin in March; this means, for example, that January 1995 is to be treated as month 13 of 1994.
The formula for the Gregorian calendar is

where
The only difference is one between Zeller's algorithm and the Gaussian algorithm, that is.
So we can get the values of months from those for the Gaussian algorithm by adding one:
Months
January1
February4
March3
April6
May1
June4
July6
August2
September5
October0
November3
December5

Wang's algorithm

Wang's algorithm for the Gregorian calendar is

where
An algorithm for the Julian calendar can be derived from the algorithm above
where is a doomsday.

Other algorithms

Schwerdtfeger's method

In a partly tabular method by Schwerdtfeger, the year is split into the century and the two digit year within the century. The approach depends on the month. For,
so is between 0 and 99. For,
The formula for the day of the week is
where the positive modulus is chosen.
The value of is obtained from the following table:
123456789101112
032503514624

The value of is obtained from the following table, which depends on the calendar. For the Gregorian calendar,
For the Julian calendar,

Lewis Carroll's method

Charles Lutwidge Dodgson devised a method resembling a puzzle, yet partly tabular in using the same index numbers for the months as in the "Complete table: Julian and Gregorian calendars" above. He lists the same three adjustments for the first three months of non-leap years, one 7 higher for the last, and gives cryptic instructions for finding the rest; his adjustments for centuries are to be determined using formulas similar to those for the centuries table. Although explicit in asserting that his method also works for Old Style dates, his example reproduced below to determine that "1676, February 23" is a Wednesday only works on a Julian calendar which starts the year on January 1, instead of March 25 as on the "Old Style" Julian calendar.
Algorithm:

Take the given date in 4 portions, viz. the number of centuries, the number of years over, the month, the day of the month.
Compute the following 4 items, adding each, when found, to the total of the previous items. When an item or total exceeds 7, divide by 7, and keep the remainder only.
Century-item: For 'Old Style' subtract from 18. For 'New Style' divide by 4, take overplus from 3, multiply remainder by 2.
Year-item: Add together the number of dozens, the overplus, and the number of 4s in the overplus.
Month-item: If it begins or ends with a vowel, subtract the number, denoting its place in the year, from 10. This, plus its number of days, gives the item for the following month. The item for January is "0"; for February or March, "3"; for December, "12".
Day-item: The total, thus reached, must be corrected, by deducting "1", if the date be January or February in a leap year, remembering that every year, divisible by 4, is a Leap Year, excepting only the century-years, in `New Style', when the number of centuries is not so divisible.
The final result gives the day of the week, "0" meaning Sunday, "1" Monday, and so on.

Examples:
;1783, September 18
17, divided by 4, leaves "1" over; 1 from 3 gives "2"; twice 2 is "4".
83 is 6 dozen and 11, giving 17; plus 2 gives 19, i.e. "5". Total 9, i.e. "2"
The item for August is "8 from 10", i.e. "2"; so, for September, it is "2 plus 31", i.e. "5" Total 7, i.e. "0", which goes out.
18 gives "4". Answer, "Thursday".
;1676, February 23
16 from 18 gives "2"
76 is 6 dozen and 4, giving 10; plus 1 gives 11, i.e. "4".
Total "6"
The item for February is "3". Total 9, i.e. "2"
23 gives "2". Total "4"
Correction for Leap Year gives "3". Answer, "Wednesday".
Since 23 February 1676 is, for Carroll, the same day as Gregorian 4 March 1676, he fails to arrive at the correct answer, namely "Friday," for an Old Style date that on the Gregorian calendar is the same day as 5 March 1677. Had he correctly assumed the year to begin on the 25th of March, his method would have accounted for differing year numbers - just like George Washington's birthday differs - between the two calendars.
It is noteworthy that those who have republished Carroll's method have failed to point out his error, most notably Martin Gardner.
In 1752, the British Empire abandoned its use of the Old Style Julian calendar upon adopting the Gregorian calendar, which has become today's standard in most countries of the world. For more background, see Old Style and New Style dates.

Implementation-dependent methods

In the C language expressions below, y, m and d are, respectively, integer variables representing the year, month and day of the month.

%7

In 1990, Michael Keith and Tom Craver published the foregoing expression that seeks to minimise the number of keystrokes needed to enter a self-contained function for converting a Gregorian date into a numerical day of the week. It preserves neither y nor d, and returns 0 = Sunday, 1 = Monday, etc.
Shortly afterwards, Hans Lachman streamlined their algorithm for ease of use on low-end devices. As designed originally for four-function calculators, his method needs fewer keypad entries by limiting its range either to A.D. 1905-2099, or to historical Julian dates. It was later modified to convert any Gregorian date, even on an abacus. On Motorola 68000-based devices, there is similarly less need of either processor registers or opcodes, depending on the intended design objective.

Sakamoto's methods

The tabular forerunner to Tøndering's algorithm is embodied in the following K&R C function. With minor changes, it was adapted for other high level programming languages such as APL2. Posted by Tomohiko Sakamoto on the comp.lang.c Usenet newsgroup in 1992, it is accurate for any Gregorian date.

dayofweek /* 1 <= m <= 12, y > 1752 */


The function does not always preserve y, and returns 0 = Sunday, 1 = Monday, etc. In contrast, the following expression

dow

posted simultaneously by Sakamoto is not easily adaptable to other languages, and may even fail if compiled on a computer that encodes characters using other than standard ASCII values, or on C compilers that enforce ANSI C compliance. For the latter consideration alone, Sakamoto's more-verbose version might be considered non-portable, as might also that of Keith and Craver.

Rata Die

's Rata Die method requires that one know the "key day" of the proleptic Gregorian calendar i.e. the day of the week of January 1, AD 1. This has to be done to establish the remainder number based on which the day of the week is determined for the latter part of the analysis. By using a given day August 13, 2009 which was a Thursday as a reference, with Base and n being the number of days and weeks it has been since 01/01/0001 to the given day, respectively and k the day into the given week which must be less than 7, Base is expressed as
Base = 7n + k
Knowing that a year divisible by 4 or 400 is a leap year while a year divisible by 100 and not 400 is not a leap year, a software program can be written to find the number of days. The following is a translation into C of IBM's method for its REXX programming language.

int daystotal

It is found that daystotal is 733632 from the base date January 1, AD 1. This total number of days can be verified with a simple calculation: There are already 2008 full years since 01/01/0001. The total number of days in 2008 years not counting the leap days is 365 *2008 = 732920 days. Assume that all years divisible by 4 are leap years. Add 2008/4 = 502 to the total; then subtract the 15 leap days because the years which are exactly divisible by 100 but not 400 are not leap. Continue by adding to the new total the number of days in the first seven months of 2009 that have already passed which are 31 + 28 + 31 + 30 + 31 + 30 + 31 = 212 days and the 13 days of August to get Base = 732920 + 502 - 20 + 5 + 212 + 13 = 733632.
What this means is that it has been 733632 days since the base date. Substitute the value of Base into the above equation to get 733632 = 7 *104804 + 4, n = 104804 and k = 4 which implies that August 13, 2009 is the fourth day into the 104805th week since 01/01/0001. 13 August 2009 is Thursday; therefore, the first day of the week must be Monday, and it is concluded that the first day 01/01/0001 of the calendar is Monday. Based on this, the remainder of the ratio Base/7, defined above as k, decides what day of the week it is. If k = 0, it's Monday, k = 1, it's Tuesday, etc.