This is a convenient method to calculate the day of the week
using an ordinary calculator and only a few simple formulas.
STEP 1. Calculate MonthIndex:
Month * 2.56 + 93
and then drop the fraction, and drop the hundreds digit, if any
(e.g., 123.72 becomes 23). So we have an integer less than 100.
STEP 2. With YLLD meaning "Year of Last Leap Day" (year during
which the last leap day occured, prior to the day in question),
calculate:
YLLD / 4 + Year + MonthIndex + Day
and then divide the result by 7.
STEP 3. Take the first digit of the decimal part (if none, use
zero), and map that to a day using the following pattern:
+-----+-----+-----+
| Sat | Sun | |
| 7 | 8 | 9 |
+-----+-----+-----+
| Thu | Fri | |
| 4 | 5 | 6 |
+-----+-----+-----+
| Tue | Wed | |
| 1 | 2 | 3 |
+-----+-----+-----+
| Mon |
| 0 |
+-----+
WAYS TO HELP YOU REMEMBER THE FORMULA:
2.56: 256 is a power of 2 (just add a dot).
93: 9 is 3 squared.
0=Mon: "Mon" has an "o" in it.
As for YLLD, it helps to be able to remember what numbers are
divisible by 4 (e.g., US election years). (For early 1904 and
prior, the method is off because the last leap year was 1896.)
Sometimes YLLD is the same as the year in question (see below).
The formula and constants may also be easier to remember if you
know why they are used. Most months start 2 or 3 days later in
the week cycle than the previous month, so we multiply by 2.56
to get the day-of-week offset caused by each month. Then, we
can discard the fraction, but we also need the "plus 93, mod
100" to compensate for Feb. being a short month. (Of course,
you could eliminate Step 1 by keeping a list of MonthIndex
values or their "mod 7" equivalents.) The use of the keypad as
a visual aid in Step 3 is a shortcut for calculating "mod 7."
EXAMPLE 1. December 31, 1999.
12 * 2.56 + 93 = 123.72 (MonthIndex = 23)
YLLD = 1996
1996 / 4 + 1999 + 23 + 31 = 2552
Divide by 7 = 364.571428..., first decimal = 5
Day of Week = Fri
EXAMPLE 2. February 29, 2000.
2 * 2.56 + 93 = 98.12 (MonthIndex = 98)
YLLD = 1996
1996 / 4 + 2000 + 98 + 29 = 2626
Divide by 7 = 375.142857..., first decimal = 1
Day of Week = Tue
EXAMPLE 3. March 1, 2000.
3 * 2.56 + 93 = 100.68 (MonthIndex = 0)
YLLD = 2000
2000 / 4 + 2000 + 0 + 1 = 2501
Divide by 7 = 357.285714..., first decimal = 2
Day of Week = Wed
This method was designed to minimize the number of constants and
formulas to remember, to minimize the number of steps to be
performed on a calculator, and to avoid conditional branches, in
order to be as easy and efficient as possible when the only
resources are your memory and a calculator.
This information is posted on the web (oz.ccnet.us/dayofweek).
If you have any comments, you may contact me there or via email.
Regards,
Hans Lachman
web: oz.ccnet.us
At yahoo Dot com: ccnetbox Dash gg09
(if all else fails, try the ccnet.us domain admin)
METHOD TO CALCULATE THE DAY OF THE WEEK FOR ALL DATES 1905-2099
- by Hans Lachman, 2009/09/09, last edit 2009/09/10
This is a convenient method to calculate the day of the week
using an ordinary calculator and only a few simple formulas.
STEP 1. Calculate MonthIndex:
Month * 2.56 + 94
and then drop the fraction, and drop the hundreds digit, if any
(e.g., 124.72 becomes 24). So we have an integer less than 100.
STEP 2. With YLLD meaning "Year of Last Leap Day" (year during
which the last leap day occured, prior to the day in question;
YLLD therefore changes after each leap day), calculate:
YLLD / 4 + Year + MonthIndex + Day
and then divide the result by 7.
STEP 3. Take the first digit of the decimal part (if none, use
zero), and map that to a day using the following pattern:
+-----+-----+-----+
| Fri | Sat | |
| 7 | 8 | 9 |
+-----+-----+-----+
| Wed | Thu | |
| 4 | 5 | 6 |
+-----+-----+-----+
| Mon | Tue | |
| 1 | 2 | 3 |
+-----+-----+-----+
| Sun |
| 0 |
+-----+
WAYS TO HELP YOU REMEMBER THE FORMULA:
2.56: 256 is a power of 2 (just add a dot).
94: 9 and 4 are both perfect squares.
0=Sun: The sun is a big round thing.
As for YLLD, it helps to be able to remember what numbers are
divisible by 4 (e.g., US election years). (For early 1904 and
prior, the method is off because the last leap year was 1896.)
Sometimes YLLD is the same as the year in question (see below).
The formula and constants may also be easier to remember if you
know why they are used. Most months start 2 or 3 days later in
the week cycle than the previous month, so we multiply by 2.56
to get the day-of-week offset caused by each month. Then, we
can discard the fraction, but we also need the "plus 94, mod
100" to compensate for Feb. being a short month. (Of course,
you could eliminate Step 1 by keeping a list of MonthIndex
values or their "mod 7" equivalents.) The use of the keypad as
a visual aid in Step 3 is a shortcut for calculating "mod 7."
EXAMPLE 1. December 31, 1999.
12 * 2.56 + 94 = 124.72 (MonthIndex = 24)
YLLD = 1996
1996 / 4 + 1999 + 24 + 31 = 2553
Divide by 7 = 364.714285..., first decimal = 7
Day of Week = Fri
EXAMPLE 2. February 29, 2000.
2 * 2.56 + 94 = 99.12 (MonthIndex = 99)
YLLD = 1996
1996 / 4 + 2000 + 99 + 29 = 2627
Divide by 7 = 375.285714..., first decimal = 2
Day of Week = Tue
EXAMPLE 3. March 1, 2000.
3 * 2.56 + 94 = 101.68 (MonthIndex = 1)
YLLD = 2000
2000 / 4 + 2000 + 1 + 1 = 2502
Divide by 7 = 357.428571..., first decimal = 4
Day of Week = Wed
This method was designed to be as easy as possible to remember
and use when the only resources are your memory and an ordinary
calculator (meaning no tables or formulas stored on paper or
electronically, no mental arithmetic, no conditional branches,
minimal constants to remember, and minimal key-clicks).
> minimal constants to remember,
What does that mean? Small constants or few of them?
--
Which of the seven heavens / Was responsible her smile /
Wouldn't be sure but attested / That, whoever it was, a god /
Worth kneeling-to for a while / Had tabernacled and rested.
On Sep 12, 1:47Â am, Frederick Williams <frederick.willia...@tesco.net>
wrote:
> Hans Lachman wrote:
> > minimal constants to remember,
>
> What does that mean? Â Small constants or few of them?
Both. I originally had "few" in mind, but small
(i.e., compact) is also good because, for example,
one 12-digit number would probably be harder
for me to remember than, say, two numbers of
2 or 3 digits each.
On Sep 11, 10:50 pm, Dave <dave_and_da...@Juno.com> wrote:
> Why not use Zeller's Congruence. See
>http://en.wikipedia.org/wiki/Zeller%27s_congruence
I find that method to be harder to remember.
But I can understand that some might find
that method easier to remember than mine.
I suppose it's subjective. Regards,
/hans
>Why not use Zeller's Congruence. See http://en.wikipedia.org/wiki/Zeller%27s_congruence
Because it's easy to do it wrong:
http://www.merlyn.demon.co.uk/zeller-c.htm#EI
Likely Errors in Implementations
It's also easy to do it right, since the right way to implement it in
software is spelled out quite clearly.
Dave
Strictly adhering to Lachman's Maxim (Complexity is a diseconomy of scale),
this method was designed to run sublimely as a stand-alone function, when
your only recourse is to call a 68k ASM program via AMS on TI calculators:
i.e. no values looked up in tables, files or libraries when executing, no
kernel, no system calls, no exception processing, minimal registers to be
used, nor the need to save any. It is valid for (historical) Julian dates
as of 1.iii.IV and for Gregorian ones from 1.iii.MCM to 29.ii.MMCC.
Although using a processor more sophisticated than found on four-function
calculators, this method is simpler to execute than Hans' original Method
of Congruence needing manipulation of data by numerically competent users.
It succeeds where other Methods do not when computing the day of the week
even on the lowliest 68k device: having no need of extra instructions for
data stored in tables as in Babwani's Method nor for redundant operations
as in Zeller's or Tondering's; yet executing in less than two dozen lines.
The function below returns the corresponding ISO-compatible weekday number,
when called with 3 inputs loaded from the following locations:
; WDN, an address for storing result d0
; FLAG, to choose between sets of calendars (93 or 94 here)
; DATE, basic ISO format YYYYMMDD date-stamp as binary word&byte&byte
;
movem.l DATE,d0,d2
move.l FLAG,d1
lea WDN,a0
;
; APPLY STEP 1 OF HANS LACHMAN'S METHOD OF CONGRUENCE
andi.l #$0000ff00,d2
divu #100,d2
add.w d2,d1
divu #100,d1
swap d1 ; D1.W CONTAINS THE MonthIndex
;
; APPLY STEP 2
move.l d0,d2
add.b d2,d1
swap d2
add.w d2,d1
subi.l #$00000300,d0
movi.l #$00000012,d2
lsr d2,d0
add.w d1,d0
divu #7,d0
swap d0 ; D0.W CONTAINS THE WEEKDAY NUMBER
;
; RETURN THE WEEKDAY NUMBER TO LOCATION WDN
move.b d0,(a0)
rts
;
; Days of the week correspond to weekday numbers as:
; Sun=0 Mon=1 Tue=2 Wed=3 Thu=4 Fri=5 Sat=6
The code is streamlined such that parameters are to be passed to it in
proper format. For example, one must pass a flag of 94 for Gregorian
dates as of 1.iii.MCM until 29.ii.MMC, and 93 from 1.iii.MMC until
29.ii.MMCC; as well as 93 for (historical) Julian dates where years
start on 1.i, and years divisible by 4 are leap years. Some historians
claim that IV A.D. was not a leap year, so that a flag of 93 thereby
applies for Julian dates only as of 1.iii.IV. It applies till Julian
29.ii.MCM--a valid date for Orthodox countries like Russia & Greece.
This function thereby gives compleat valid historical continuity of
date conversion for SOMEWHERE on the planet for all days from 1.iii.IV
to 29.ii.MMCC. Otherwise, it still gives valid conversions for Julian
dates on the Orthodox calendar until 31.xii.MMMMCCXLVI A.D.
--
REFERENCES
http://oz.ccnet.us/dayofweek/
http://www.guernsey.net/~sgibbs/roman.html
http://en.wikipedia.org/wiki/Zeller%27s_congruence
http://www.tondering.dk/claus/cal/node3.html#SECTION00360000000000000000
babwani-congruence.blogspot.com/search/label/Frequently%20Asked%20Questions
HOW TO CALCULATE THE DAY OF THE WEEK FOR DATES AS OF 15.x.1582
based on Hans' No-Sweat 1-Off 2-Fold 3-Step 4-Function Calculator Method
This is a more involved method to calculate the day of the week
for Gregorian calendar dates from 15.x.1582 and as far into the
future as workable using standard four-function calculators and
certain mobile phones via a generalised formula requiring fewer
key-clicks than any previous method not using tables.
Given:
Day.Month.Year as a Date on the Gregorian calendar as of
15.octob.1582
&
YLJLD as the 'Year in which the Last Julian Leap Day occurred' prior to
the given Date as if for a Julian Calendar whose years begin on 1.jan.
&
delta = Year - YLJLD
&
Century as a nominal "age" for each hundred of years as of 1.march.XY00
(only one lag Offset thereby required for an entire Gregorian Century)
so that if YLJLD = XYQR, then Century = XY (starting with Century 15)
&
yljld as the last two digits of XYQR, such that yljld = QR
&
under as the number of years that Century is less than the next higher
multiple of 4;
one can convert the given Date into a day of the week after completing
the 3 steps below--with 33 key-clicks or less, without any mental
multiplication or division.
STEP 0. Calculate the lag Offset:
under * 2
Remember the result or store it in memory.
STEP 1. Calculate the given Date's MonthIndex:
Month * 2.56 + 94
and then drop the fraction, and the hundreds digit, if any,
to get an integer less than 100, e.g. 124.72 becomes 24;
remember the result for use in Step 2.
STEP 2. Apply the generalised date conversion formula:
(yljld/.8 + delta + MonthIndex + Day + Offset) / 7
STEP 3. Apply Hans' keypad mapping:
Take the first digit after the decimal point (if none, use 0)
and map that to a day using the following patterns:
+-----+-----+-----+ +-----+-----+-----+
| Fri | Sat | | | 1 | 2 | 3 |
| 7 | 8 | 9 | | Mon | Tue | |
+-----+-----+-----+ +-----+-----+-----+
| Wed | Thu | | | 4 | 5 | 6 |
| 4 | 5 | 6 | | Wed | Thu | |
+-----+-----+-----+ +-----+-----+-----+
| Mon | Tue | | | 7 | 8 | 9 |
| 1 | 2 | 3 | | Fri | Sat | |
+-----+-----+-----+ +-----+-----+-----+
| Sun | | 0 |
| 0 | | Sun |
+-----+ +-----+
(This is equivalent to assigning days to remainders of divisions by 7
as for: Sun=0 Mon=1 Tue=2 Wed=3 Thu=4 Fri=5 Sat=6.)
Lag is the number of days that a Gregorian date to be converted falls before
the same Julian date. It was zero for Century 02, during which the Gregorian
Calendar, if already implemented beforehand, would have been the same as the
Julian--thus leading to Hans' Julian Step 2 formula. It must be decreased by
1 for every March 1st preceded by February 29th in the Julian but not in the
Gregorian calendar. Lag is now -13 and will be -14 as of 1.iii.MMC to start
off Century 21 when Hans' shorter Julian formula applies again to Gregorian
dates, the last time being in Centuries 11 & 12 when it was -7 in both. In
Century 00 as of 1.iii.IV, it was +2.
EXAMPLE Z. 29.Feb.1904 Century = 19 yljld = 00 delta = 4 under = 1
1 * 2 = 2
2 * 2.56 + 94 = 99.12 (MonthIndex = 99)
00/.8 + 4 + 99 + 29 + 2
Divide by 7 = 19.142857...
first decimal = 1 Day of Week = Mon
EXAMPLE A. 31.Dec.2100 Century = 21 yljld = 00 delta = 0 under = 3
3 * 2 = 6
12 * 2.56 + 94 = 124.72 (MonthIndex = 24)
00/.8 + 0 + 24 + 31 + 6
Divide by 7 = 8.714285...
first decimal = 7 Day of Week = Fri
EXAMPLE B. 29.Feb.2000 Century = 19 yljld = 96 delta = 4 under = 1
1 * 2 = 2
2 * 2.56 + 94 = 99.12 (MonthIndex = 99)
96/.8 + 4 + 99 + 29 + 2
Divide by 7 = 36.285714...
first decimal = 2 Day of Week = Tue
EXAMPLE C. 1.Mar.2000 Century = 20 yljld = 00 delta = 0 under = 4
4 * 2 = 8
3 * 2.56 + 94 = 101.28 (MonthIndex = 1)
00/.8 + 0 + 1 + 1 + 8
Divide by 7 = 1.428571...
first decimal = 4 Day of Week = Wed
The Examples above are for a standard (running total) calculator;
those for RPN or algebraic calculators are left as an exercise.
(Hint: re-order Steps and streamline operations.)
--
REFERENCES: http://oz.ccnet.us/dayofweek/
http://groups.google.com/group/sci.math/msg/a716e5ca3af3ed28
Strictly adhering to Lachman's Maxim (Complexity is a diseconomy of scale)
a reworking of Hans' Method has been coded as a stand-alone function when
your only recourse is to call a 68k ASM program via AMS on TI calculators:
i.e. no values looked up in tables, files or libraries when executing, no
kernel, no system calls, no exception processing, minimal registers to be
used, nor the need to save any. It is for valid Gregorian dates from 1582,
as of the Ides of October, to 4004 A.D.
Although using as unsophisticated a processor as a 68k on programmable TI
calculators, this reworking of Hans' Method is more efficient than others.
It succeeds where other methods do not when computing the day of the week
even on the lowliest 68k device: having no need of extra instructions for
data stored in tables as in Babwani's Method nor for redundant operations
as in Zeller's or Tondering's--nor even a C compiler running on a bloated
development system as in Mike Keith's--yet executing in less than 2 dozen
operations, and needing just 2 registers.
The function below returns the corresponding ISO-compatible weekday number
when called with 2 inputs loaded from the following 2 locations:
; WDN, an address for storing result d0
; DATE, basic ISO-format date-stamp cymd as 2 pairs of base-100 bytes
;
movem.l DATE,d1,d2
;
; STEP 1
andi.l #$f00,d1
divu #100,d1
add.w #$7a,d1
andi.l #$7f,d1 ; Month Index
;
; STEP 2
add.b d2,d1
swap d2
add.b d2,d1
swap d2
subi.l #$300,d2
lsl #6,d2
rol #3,d2
addq.b #8,d1
sub.b d2,d1
movi.l #27,d0
lsr d0,d2
add.b d1,d2 ; QRdiv4 + y + MI + d + under+under
;
divu #7,d2
swap d2 ; D2.W BECOMES THE WEEKDAY NUMBER
;
; RETURN THE WEEKDAY NUMBER TO LOCATION WDN
move.b d2,WDN
rts
;
; Days of the week correspond to weekday numbers as:
; Sun=0 Mon=1 Tue=2 Wed=3 Thu=4 Fri=5 Sat=6
Inputs are to be passed in the proper format:
No component of a Date may be passed as a pair of base 10 nibbles.
--
REFERENCES
http://oz.ccnet.us/dayofweek/
http://www.guernsey.net/~sgibbs/roman.html
http://www.merlyn.demon.co.uk/zel-like.htm#Keith
http://www.tondering.dk/claus/cal/node3.html#SECTION00360000000000000000
babwani-congruence.blogspot.com/search/label/Frequently%20Asked%20Questions
TEXAS 2-STEP 2.2 TO CALCULATE THE DAY OF THE WEEK AS OF 1582 TO 2Y2K2
- via transfiguration of Hans Lachman's Method of Congruence -
Strictly adhering to Lachman's Maxim (Complexity is a diseconomy of scale)
a reworking of Hans' Method has been coded as a stand-alone function when
your only recourse is to call a 68k ASM program via AMS on TI calculators:
i.e. no values looked up in tables, files or libraries when executing, no
kernel, no system calls, no exception processing, minimal registers to be
used, nor the need to save any. It is for valid Gregorian dates from 1582,
as of the Ides of October, to 4004 A.D.
Although using as unsophisticated a processor as a 68k on programmable TI
calculators, this reworking of Hans' Method is more efficient than others.
It succeeds where other methods do not when computing the day of the week
even on the lowliest 68k device: having no need of extra instructions for
data stored in tables as in Babwani's Method nor for redundant operations
as in Zeller's or Tondering's--nor even a C compiler running on a bloated
development system as in Mike Keith's--yet executing in less than 2 dozen
operations, and needing just 2 registers.
The function below returns the corresponding ISO-compatible weekday number
when called with 2 inputs loaded from the following 2 locations:
; WDN, an address for storing result d2
; DATE, basic ISO-format date-stamp CYmd as 2 pairs of base-10^2 bytes
;
movem.l DATE,d1,d2
;
; APPLY STEP 1 OF HANS LACHMAN'S METHOD OF CONGRUENCE
andi.l #$f00,d1
divu #100,d1
add.w #94,d1
andi.l #$ff,d1
divu #100,d1 ; Month Index
;
; STEP 2
add.l d2,d1
swap d1
add.b d2,d1
subi.l #$300,d2
lsl #6,d2
rol #3,d2
addq.b #8,d1
sub.b d2,d1
lsr #7,d2
lsr #7,d2
lsr #7,d2
lsr #6,d2
add.w d1,d2 ; QRdiv4 + Y + MI + d + under+under
TEXAS 2-STEP 2.2 TO CALCULATE THE DAY OF THE WEEK AS OF 1582 TO 2Y2K2
- via an elaboration of Hans Lachman's Method of Congruence -
Strictly adhering to Lachman's Maxim (Complexity is a diseconomy of scale)
a reworking of Hans' Method has been coded as a stand-alone function when
your only recourse is to call a 68k ASM program via AMS on TI calculators:
i.e. no values looked up in tables, files or libraries when executing, no
kernel, no system calls, no exception processing, minimal registers to be
used, nor the need to save any. It is for valid Gregorian dates from 1582,
as of the Ides of October, to 4004 A.D.
Although using as unsophisticated a processor as a 68k on programmable TI
calculators, this reworking of Hans' Method is more efficient than others.
It succeeds where other methods do not when computing the day of the week
even on the lowliest 68k device: having no need of extra instructions for
data stored in tables as in Babwani's Method nor for redundant operations
as in Zeller's or Tondering's--nor even a C compiler running on a bloated
development system as in Mike Keith's--yet executing in less than 2 dozen
operations, and needing just 2 registers.
The function below returns the corresponding ISO-compatible weekday number
when called with 2 inputs loaded from the following 2 locations:
; WDN, an address for storing result d2
; DATE, basic ISO-format date-stamp CYmd as 2 pairs of base-10^2 bytes
;
movem.l DATE,d1,d2
;
; APPLY STEP 1 (HANS LACHMAN'S METHOD OF CONGRUENCE)
andi.l #$f00,d1
divu #100,d1
add.w #94,d1
andi.l #$ff,d1
divu #100,d1 ; Month Index
;
; STEP 2
add.l d2,d1
swap d1
add.b d2,d1
subi.l #$300,d2
lsl #6,d2
rol #3,d2
addq.b #8,d1
sub.b d2,d1
lsr #7,d2
lsr #7,d2
lsr #7,d2
lsr #6,d2
add.b d1,d2 ; QRdiv4 + Y + MI + d + under+under