Checking for Leap Year in Detail

Every programmer face leap year problem at least once and most of them just memorise following formula.

return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0

I am going to tell you math behind this formula.

Total actual days in a year = 365.2422
Days in a Non leap year = 365
Now, we have to settle fraction part of days i.e. 0.2422 somehow. Because we can’t increase or decrease a day in fraction. So, we increase 1 day in certain years called leap years. when we should increase it? is an interesting question which I am going to tell you in this article.

Let’s try to convert fraction part (0.2422) into from of 1/a where a is an integer.
1/4 = 0.25 (which is greater than 0.2422).

Let’s try to decrease it a little bit.
1/4 - 1/100 
= 0.25 – 0.01 
= 0.24 (It is smaller than 0.2422).

1/4 – 1/100 + 1/400 
= 0.25 – 0.01 + 0.0025 
= 0.2425 
It’s became greater again. But we are closer this time.

Let’s decrease it
1/4 – 1/100 + 1/400 – 1/2500 
= 0.25 – 0.01 + 0.0025 – 0.0004 
= 0.2421
It’s working! one more and we done.

1/4 – 1/100 + 1/400 – 1/2500 + 1/10000 
= 0.25 – 0.01 + 0.0025 – 0.0004 + 0.0001 
= 0.2422
Great! we solved it.

To make a decision for a leap year, look last expression. When we should declare a leap year?
Every 4th year: Yes
Every 100th year: No
Every 400th year: Yes
Every 2500th year: No
Every 10,000th year: Yes

Let’s consider every case. 
we can easily see that every number above divisible by 4. So, we have to neglect specific case as follow.

year % 4 == 0 and year % 100 != 0

above code included 4th but neglected 100th. And by neglecting 100 we neglected all further years because they are divisible by 100. 
i.e. 400 % 100 == 0 ,2500 % 100 == 0 and 1000 % 100 == 0 
So, we have to specifically include 400th as follow.

(year % 4 == 0 and year % 100 != 0) or year % 400 == 0

We don’t need to work for 2500 because It is already neglected by 100. And didn’t included by 400 as 2500 % 100 == 0 But 2500 % 400 != 0 .

Similarly, By including 400, we already included 10,000.
i.e. 10000 % 400 == 0 So, we don’t need to check for 10,000.

Now we came to the point when we can write our program.

return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0