home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume7 / yearlength / READ_ME < prev    next >
Text File  |  1987-01-19  |  6KB  |  134 lines

  1.  
  2.  
  3.   This collection of functions attempts to provide the number of
  4. days in a year based upon a selected year and country.  It is
  5. being posted because of a promise I made to the readers of net.lang.c.
  6.  
  7.   There are basically three levels of that can be used in to calculate
  8. how long a year is:
  9.  
  10.     1. Divisibility by 4 -- this works for the years 1901-2099 and,
  11.        as a result, is suitable for nearly all programs.  It can be
  12.        coded as:                     or a faster version:
  13.        
  14.        if (year % 4 == 0)             if ((year & 0x03) == 0)
  15.            days_in_year = 366;            days_in_year = 366;
  16.        else                           else
  17.            days_in_year = 365;            days_in_year = 365;
  18.  
  19.  
  20.     2. Gregorian rules -- this works from the year after your country
  21.        adopted the Gregorian calendar through the forseeable future.
  22.        It can be coded as:
  23.  
  24.        if (year%4 == 0 && year%100 != 0 || year%400 == 0)
  25.            days_in_year = 366;
  26.        else
  27.            days_in_year = 365;
  28.  
  29.        or slightly faster (as Karl Heuer suggested to me via mail):
  30.  
  31.        if ((year%4 == 0) && (year%100 != 0 || year%400 == 0))
  32.            days_in_year = 366;
  33.        else
  34.            days_in_year = 365;
  35.  
  36.        or (depending on how the remainder operator is implemented)
  37.        this is up to 5 times faster by taking advantage of some
  38.        common factors of 100 and 400:
  39.  
  40.        register int ndiv100;    /* Boolean for not divisible by 100 */
  41.  
  42.        if ((year&0x3)==0 && (ndiv100=year%100) || (year&0xF)==0 && !ndiv100)
  43.            days_in_year = 366;
  44.        else
  45.            days_in_year = 365;
  46.  
  47.        or even faster by using Karl Heuer's suggestion of reordering
  48.        the expression:
  49.  
  50.        if ((year&0x3)==0 && ((year&0xF)==0 || year%100!=0))
  51.            days_in_year = 366;
  52.        else
  53.            days_in_year = 365;
  54.  
  55.        I believe that this is the fastest possible check for leap years.
  56.        Does anyone know of a fast check for remainders so that the "% 100"
  57.        test can be speeded up?
  58.  
  59.     3. Country-dependent rules --  which is what this collection of
  60.        functions attempt to do.  It gets messy.
  61.  
  62.  
  63.  
  64. BACKGROUND INFORMATION OF COUNTRY-DEPENDENT RULES
  65. -------------------------------------------------
  66.  
  67.   When dealing with calendars based on different epochs (e.g., Egyptian,
  68. Roman Republican, Julian, Augustan, Christian/Gregorian, Jewish, Muslim,
  69. Chinese, Mayan, Japanese) it is easier to convert dates into a scheme that
  70. has a starting date older than that of any of the epochs.  Such a scheme
  71. was invented by J. Scalinger in 1583.  
  72.  
  73.   However, all years as used by this package are those of the Christian
  74. era because that is the most common representation used throughout the
  75. world.  Valid years are 1AD through 9999AD.   There is no year 0.  Negative
  76. years (those BC) are not used in this program because the Julian calendar
  77. was still being changed by Augustus in 8BC (renamed the month Sextilus
  78. to August and changed the number of days in several months).
  79.  
  80.   The argument may be made that going to years before the 4th Century AD
  81. is fruitless.  It is about that time that the Emperor Constantine (he had
  82. previously converted to Christianity) made the 7 day week official
  83. throughout the Roman Empire.  The Celtic calendar had 8 days but the
  84. calendar Moses took with him from Egypt had 7.  It's fascinating how
  85. calendars tie in with history.  Had the Nazis won WW2, we now might have
  86. a calendar based on the birth of Hitler!  And it was about that time that
  87. the year of Christ's birth, instead of the start of City of Rome, was
  88. suggested as the basis for counting years.
  89.  
  90.   It is not possible to guarentee the accuracy for very early dates.  
  91. The references that I consulted occasionally would disagree on dates.
  92. There are many difficulties in arriving at a definitive answer for
  93. a region's calendar because of national and supernational influences.
  94. Some of these are: wars that change boundaries; country-dwellers
  95. resistance to the calendar change wrought by the city-based government;
  96. and religous differences over what is the "right" calendar.  Many
  97. Protestants chose to be "wrong with the calendar rather than right with
  98. the Pope".  For examples of such turmoil see any of the *_early() functions.
  99.  
  100.   An assumption that I used to decide when a country should be put
  101. in the switched-to-Gregorian calendar list, if I could not find a
  102. clear date, was to take the switch over date of its ruling country.
  103. All of the South American countries use Spain's date even though
  104. the reality of when countries actually changed is much more complex.
  105. The many British colonies use the same year as Great Britain, 1752.
  106. See canada_early() for a the type of trouble caused by two dominant
  107. countries: Britain and France.  So, a plea to those out there that
  108. want to rule the world: When you do take over, see to that the rules
  109. are observed consistently!  It makes everything much easier :-)
  110.  
  111.   Some countries did not transistion directly from the Julian to the
  112. Gregorian calendar.  An alternate calendar was tried or the calendar
  113. was modified only slightly.  See the france_early(), sweden_early(),
  114. and ussr_early() functions.
  115.  
  116.   Some of the date/country pairs are historically naive.  By all
  117. rights, Israeli dates should not exist before 1948.  However because
  118. the country of Palestine was following the same year rules prior to
  119. 1948, I allowed it.  Many, many such arguments can be made (e.g., how
  120. to handle dates in years before the USA gained independence or even
  121. before it was "discovered" by Columbus/stray Vikings/Anasazi Indians.
  122. Change the dates to make yourself happy.
  123.  
  124.   The list of countries is not complete.  I have no intention of 
  125. extending it to cover all current, past, and future countries.  If
  126. you want to do it yourself, feel free to hack it up.
  127.  
  128.   I would appreciate the reception of any changes/corrections you make!
  129.  
  130.  
  131. Bob Devine
  132. November 1986 (Gregorian style numbering)
  133.  
  134.