kernel / pub / scm / utils / util-linux / util-linux / 35c84bf76a4776a00d0bb782ceef6182170c5a7a / . / Documentation / cal.txt

The cal(1) date routines were written from scratch, basically from first | |

principles. The algorithm for calculating the day of week from any | |

Gregorian date was "reverse engineered". This was necessary as most of | |

the documented algorithms have to do with date calculations for other | |

calendars (e.g. julian) and are only accurate when converted to gregorian | |

within a narrow range of dates. | |

1 Jan 1 is a Saturday because that's what cal says and I couldn't change | |

that even if I was dumb enough to try. From this we can easily calculate | |

the day of week for any date. The algorithm for a zero based day of week: | |

calculate the number of days in all prior years (year-1)*365 | |

add the number of leap years (days?) since year 1 | |

(not including this year as that is covered later) | |

add the day number within the year | |

this compensates for the non-inclusive leap year | |

calculation | |

if the day in question occurs before the gregorian reformation | |

(3 sep 1752 for our purposes), then simply return | |

(value so far - 1 + SATURDAY's value of 6) modulo 7. | |

if the day in question occurs during the reformation (3 sep 1752 | |

to 13 sep 1752 inclusive) return THURSDAY. This is my | |

idea of what happened then. It does not matter much as | |

this program never tries to find day of week for any day | |

that is not the first of a month. | |

otherwise, after the reformation, use the same formula as the | |

days before with the additional step of subtracting the | |

number of days (11) that were adjusted out of the calendar | |

just before taking the modulo. | |

It must be noted that the number of leap years calculation is sensitive | |

to the date for which the leap year is being calculated. A year that occurs | |

before the reformation is determined to be a leap year if its modulo of | |

4 equals zero. But after the reformation, a year is only a leap year if | |

its modulo of 4 equals zero and its modulo of 100 does not. Of course, | |

there is an exception for these century years. If the modulo of 400 equals | |

zero, then the year is a leap year anyway. This is, in fact, what the | |

gregorian reformation was all about (a bit of error in the old algorithm | |

that caused the calendar to be inaccurate.) | |

Once we have the day in year for the first of the month in question, the | |

rest is trivial. |