TEXT   44

The cal date routines

Guest on 2nd May 2022 01:36:03 AM

  1. The cal(1) date routines were written from scratch, basically from first
  2. principles.  The algorithm for calculating the day of week from any
  3. Gregorian date was "reverse engineered".  This was necessary as most of
  4. the documented algorithms have to do with date calculations for other
  5. calendars (e.g. julian) and are only accurate when converted to gregorian
  6. within a narrow range of dates.
  7.  
  8. 1 Jan 1 is a Saturday because that's what cal says and I couldn't change
  9. that even if I was dumb enough to try.  From this we can easily calculate
  10. the day of week for any date.  The algorithm for a zero based day of week:
  11.  
  12.         calculate the number of days in all prior years (year-1)*365
  13.         add the number of leap years (days?) since year 1
  14.                 (not including this year as that is covered later)
  15.         add the day number within the year
  16.                 this compensates for the non-inclusive leap year
  17.                 calculation
  18.         if the day in question occurs before the gregorian reformation
  19.                 (3 sep 1752 for our purposes), then simply return
  20.                 (value so far - 1 + SATURDAY's value of 6) modulo 7.
  21.         if the day in question occurs during the reformation (3 sep 1752
  22.                 to 13 sep 1752 inclusive) return THURSDAY. This is my
  23.                 idea of what happened then. It does not matter much as
  24.                 this program never tries to find day of week for any day
  25.                 that is not the first of a month.
  26.         otherwise, after the reformation, use the same formula as the
  27.                 days before with the additional step of subtracting the
  28.                 number of days (11) that were adjusted out of the calendar
  29.                 just before taking the modulo.
  30.  
  31. It must be noted that the number of leap years calculation is sensitive
  32. to the date for which the leap year is being calculated.  A year that occurs
  33. before the reformation is determined to be a leap year if its modulo of
  34. 4 equals zero.  But after the reformation, a year is only a leap year if
  35. its modulo of 4 equals zero and its modulo of 100 does not.  Of course,
  36. there is an exception for these century years.  If the modulo of 400 equals
  37. zero, then the year is a leap year anyway.  This is, in fact, what the
  38. gregorian reformation was all about (a bit of error in the old algorithm
  39. that caused the calendar to be inaccurate.)
  40.  
  41. Once we have the day in year for the first of the month in question, the
  42. rest is trivial.

Raw Paste


Login or Register to edit or fork this paste. It's free.