Saturday, September 20, 2008

Zeller's Rule



Zeller's rule is used to calculate the day on which any date falls for any year. With this technique you will have the calendar for any given year available to you.

The rule is as follows

f = k + [(13*m - 1)/5] + d + [d/4] + [c/4] - 2*c

where,

k = day of month
m = month number, taking Mar=1, ..., Dec=10, Jan=11, Feb=12
d = last two digits of year, using the previous year for Jan and Feb
c = first two digits of year

Rules:

1.In Zeller's rule the year begins in March and ends in February. Hence, the month number from March is 1, April is 2, May is 3 and so on up to January, which is 11, and February is 12.

2.January and February are counted as the 11th and 12th months of the previous year. Hence, if you are calculating the day of any date on January 2026, the notation will be (month=11 and year= 2025) instead of (month=1 and year=2026).

3.While calculating, we drop off every number after the decimal point.

4.Once we have found the answer we divide it by 7 and take the remainder. Remainder 0 corresponds to Sunday; Remainder 1 corresponds to Monday ; Remainder 2 corresponds to Tuesday and so on....

Example:

Find the day on 26th June 1983

f = k + [(13*m - 1)/5] + d + [d/4] + [c/4] - 2*c

Here k=26, m=4, d=83, c =19

f= 26+(13*4-1/5)+83+83/4+19/4-2*19
= 105

105 divided by 7 leaves a remainder 0. Hence the day is a Sunday!


Derivation of the formula:

Here we're defining

k = day of month
m = month number, taking Mar=1, ..., Dec=10, Jan=11, Feb=12
d = last two digits of year, using the previous year for Jan and Feb
c = first two digits of year

The formula is then

f = k + [(13*m - 1)/5] + d + [d/4] + [c/4] - 2*c

and we use the remainder after dividing f by 7 to find the day of the
week.

Where does this come from? Let's first note the reason for the odd
handling of months: we want leap day not to affect the formula, so we
move it to the end of the 'year', and act as if the year began on
March 1.

Now note that in defining f, all we care about is the remainder after
dividing, so it will be enough to make sure that f increases by 1
whenever the day of the week advances by one day; we don't care about
the actual value of f.

Now let's build the formula piece by piece.

How does the year affect the day? Well, since 365 = 7*52+1, each
normal year advances the day by 1, so our formula can start with the
year number:

f = d

Whenever the year advances by 1, so does the day of the week.

But we have to adjust this to account for leap years. Every four years
we have an extra day, so we'll want to add 1 to f. This is done by
adding [d/4], since this increases by 1 only when d becomes a multiple
of 4, which is a leap year. So now we have

f = d + [d/4]

Now how do centuries affect the day? A century contains 100 years, 24
of which normally are leap years (since century days, like 1900, are
NOT leap years). So each century the day advances by 124 days, which
is 7*18-2, and therefore the day of the week goes BACK 2 days. So we
have

f = d + [d/4] - 2*c

But every fourth century year IS a leap year (as 2000 was), so we
have to adjust just as we did for leap years:

f = d + [d/4] - 2*c + [c/4]

Now we come to the months, and this is the cute part. Consider, for
each month, how many days it has BEYOND 28, and then add that up to
see the effect the months have on the day of the week:

1 2 3 4 5 6 7 8 9 10 11 12
Month Mar Apr May Jun Jul Aug Sep Oct Nov Dec Jan Feb
Days 31 30 31 30 31 31 30 31 30 31 31 (28)
Excess 3 2 3 2 3 3 2 3 2 3 3 0
Accum 0 3 5 8 10 13 16 18 21 23 26 29
\_________________/\__________________/\_______

The number of accumulated days is counted at the start of the month,
so if we divide it by 7, the remainder shows how many weekdays the
start of the month is from the starting day for the 'year'.

Notice the pattern in the excess: 3,2,3,2,3 repeats every five months,
and the accumulation reaches 13 in that time. So every 5 months, we
want to add 13 days. That suggests that we want to add a term like
[13m/5]. That doesn't quite give us what we want:

1 2 3 4 5 6 7 8 9 10 11 12
Month Mar Apr May Jun Jul Aug Sep Oct Nov Dec Jan Feb
Days 31 30 31 30 31 31 30 31 30 31 31 (28)
Excess 3 2 3 2 3 3 2 3 2 3 3 0
Accum 0 3 5 8 10 13 16 18 21 23 26 29
13m 13 26 39 52 65 78 ...
[13m/5] 2 5 7 10 13 15 ...

If we subtract 2 from this, it isn't quite right; we have to shift it
a bit. So after playing with it a bit, we find

13m-1 12 25 38 51 64 77 ...
[(13m-1)/5] 2 5 7 10 12 15 ...
[(13m-1)/5]-2 0 3 5 8 10 13 ...

That's just what we want. So we'll use

f = d + [d/4] - 2*c + [c/4] + [(13m-1)/5] - 2

Finally, we have to add the day, since each day obviously adds one to
the day of the week; and adjust to get the right day of the week for,
say, Mar 1, 2000, since nothing we've done so far actually determined
WHICH day we start the whole pattern on. It turns out that we can just
remove the -2, and we get

f = d + [d/4] - 2*c + [c/4] + [(13m-1)/5] + k

And there's the formula!

3 comments:

  1. Awesome presentation and useful one ! Anyhow. Later I will provide the 'c' and Java program for this which you can add below. Thanks buddy - jacob

    ReplyDelete
  2. wow.............very useful

    ReplyDelete
  3. What if the year is 2000 or any year between 2000 to 2009.I don't think the formula holds good.Can you please suggest some alternative ?

    ReplyDelete

Thanks for commenting in my blog...