Perpetual Calendar – Weekday computation in your head
To compute the (Gregorian calendar's) weekday for any date, all you need are the following formula and table:
( DayOfMonth + MonthCode + Year + Year/4 – 2×(Century%4) – isLeapJanFeb ) % 7
| Mon | 0 | Aug
|
| Tue | 1 | Feb, Mar, Nov
|
| Wed | 2 | Jun
|
| Thu | 3 | Sep, Dec
|
| Fri | 4 | Apr, Jul
|
| Sat | 5 | Jan, Oct
|
| Sun | 6 | May
|
If you care to memorize this, you might prefer the following table for the months:
| JFM | AMJ | JAS | OND
|
| 511 | 462 | 403 | 513
|
In the formula,
- / is integer division (divide and ignore the remainder)
- % is the modulus operator (yields the remainder ignored in the above division)
- Century are the first two digits of the given four-digit year
- Year are the latter two digits of the given four-digit year
- MonthCode is the number left of the given month in the table
- isLeapJanFeb is usually 0, but 1 in case the year is a leap year and the month is January or February
(leap years are those that are a multiple of 4 and either no multiple of 100 or a multiple of 400, e.g. 1996 and 2000, but not 2100)
In order to find the weekday, the resulting number only needs to be looked up in the table already used for the months. You can check the result using this form:
Example: 8 May 1945
| ( | DayOfMonth | + | MonthCode | + | Year | + | Year/4 | – | 2×(Century%4) | – | isLeapJanFeb | ) % 7
|
| ( | 8 | + | 6 | + | 45 | + | 45/4 | – | 2×(19%4) | – | 0 | ) % 7
|
| ( | 8 | + | 6 | + | 45 | + | 11 | – | 2×3 | – | 0 | ) % 7 | = | 64 % 7 | = | 1
|
So the official end of World War II in Europe was a Tuesday. You might check for yourself that it began (1 Sep 1939) on a Friday. Unfortunately with not just one, but 297 weekends in between...
Julian Calendar
In this calendar, not only are leap years simply defined as all those that are a multiple of 4, but the formula also differs slightly:
( DayOfMonth + MonthCode + Year + Year/4 + 5 – Century – isLeapJanFeb ) % 7
Example: 24 Aug 0079, the day Pompeii was buried by Mt. Vesuvius' eruption, was a Tuesday [(24+0+79+19+5–0–0)%7=1]. In the Gregorian calendar, it would have been 22 Aug 0079 (how to compute this is a different story), which unsurprisingly was a Tuesday as well [(22+0+79+19–0–0)%7=1]: When switching from Julian to Gregorian because the former was getting out of sync with the seasons, there was no need to additionally interrupt the cycle of weekdays.