1 |
|
---|
2 |
|
---|
3 |
|
---|
4 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
5 |
|
---|
6 |
|
---|
7 |
|
---|
8 | NNNNAAAAMMMMEEEE
|
---|
9 | greg - compute details of Gregorian calendar
|
---|
10 |
|
---|
11 | SSSSYYYYNNNNTTTTAAAAXXXX
|
---|
12 | ggggrrrreeeegggg YYYYeeeeaaaarrrr MMMMoooonnnntttthhhh DDDDaaaayyyyOOOOffffMMMMoooonnnntttthhhh [[[[DDDDaaaayyyyOOOOffffWWWWeeeeeeeekkkk WWWWeeeeeeeekkkkOOOOffffMMMMoooonnnntttthhhh DDDDaaaayyyyOOOOffffYYYYeeeeaaaarrrr
|
---|
13 | JJJJuuuulllliiiiaaaannnnDDDDaaaayyyy]]]]
|
---|
14 |
|
---|
15 | SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
|
---|
16 | _G_r_e_g provides calendar information. It approximates the
|
---|
17 | functionality of unix cal except that the information is
|
---|
18 | provided in a way that is appropriate for use in other
|
---|
19 | programs rather than visual display.
|
---|
20 |
|
---|
21 | The internal function "gregorian" is designed to be used as
|
---|
22 | a component of other programs.
|
---|
23 |
|
---|
24 | DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
|
---|
25 | The program is invertible in the sense of a logic
|
---|
26 | programming predicate. That is, inputs with positive values
|
---|
27 | are checked for consistency; missing inputs (indicated by
|
---|
28 | otherwise illegal value 0) are given the correct positive
|
---|
29 | value if possible.
|
---|
30 |
|
---|
31 | If all the output is correct, the program will exit with 0.
|
---|
32 |
|
---|
33 | If the input cannot be reconciled, the program will exit
|
---|
34 | with 1.
|
---|
35 |
|
---|
36 | If the input leaves the output indeterminate, the program
|
---|
37 | will exit with 2.
|
---|
38 |
|
---|
39 | If the C implementation cannot support the calculation
|
---|
40 | because of arithmetic precision, the program will exit with
|
---|
41 | 3.
|
---|
42 |
|
---|
43 | PPPPAAAARRRRAAAAMMMMEEEETTTTEEEERRRRSSSS
|
---|
44 | There are seven related inputs. Inputs 1-3 are required.
|
---|
45 | If inputs 4-7 are omitted, zero is assumed for each.
|
---|
46 |
|
---|
47 | The _Y_e_a_r is an integer >= _1_5_8_2
|
---|
48 |
|
---|
49 | The _M_o_n_t_h is an integer between _1 and _1_2.
|
---|
50 |
|
---|
51 | The _D_a_y_O_f_M_o_n_t_h is an integer between _1 and _2_8, _2_9, _3_0 or _3_1
|
---|
52 | depending on the month.
|
---|
53 |
|
---|
54 | The _D_a_y_O_f_W_e_e_k is an integer between _1 and _7 corresponding to
|
---|
55 | _S_u_n_d_a_y, _M_o_n_d_a_y, ... _S_a_t_u_r_d_a_y. It is the column position of
|
---|
56 | the date in the conventional monthly calendar tableau.
|
---|
57 |
|
---|
58 | The _W_e_e_k_O_f_M_o_n_t_h is an integer between _1 and _6 corresponding
|
---|
59 | to weeks in the calendar month. It is the row position of
|
---|
60 |
|
---|
61 |
|
---|
62 |
|
---|
63 | Page 1 (printed 3/10/86)
|
---|
64 |
|
---|
65 |
|
---|
66 |
|
---|
67 |
|
---|
68 |
|
---|
69 |
|
---|
70 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
71 |
|
---|
72 |
|
---|
73 |
|
---|
74 | the date in the conventional monthly calendar tableau. The
|
---|
75 | first of the month is always in week _1.
|
---|
76 |
|
---|
77 | The _D_a_y_O_f_Y_e_a_r is an integer between _1 and _3_6_5 or _3_6_6
|
---|
78 |
|
---|
79 | The _J_u_l_i_a_n_D_a_y is an integer >= _2_2_9_9_1_6_1, corresponding to _1_5
|
---|
80 | _O_c_t_o_b_e_r, _1_5_8_2. It measures the time in days from 1 Jan 4713
|
---|
81 | BC (Julian calendar). Each julian day starts at noon, GMT
|
---|
82 | of the corresponding day of the Gregorian calendar.
|
---|
83 | Astronomers express the relation between julian day j and
|
---|
84 | date d as dd.5/mm/yyyy = j.0 where both "day"s are real
|
---|
85 | numbers. dd.5 is noon of day dd. j.0 is the beginning of
|
---|
86 | julian day j.
|
---|
87 |
|
---|
88 |
|
---|
89 |
|
---|
90 |
|
---|
91 |
|
---|
92 |
|
---|
93 |
|
---|
94 |
|
---|
95 |
|
---|
96 |
|
---|
97 |
|
---|
98 |
|
---|
99 |
|
---|
100 |
|
---|
101 |
|
---|
102 |
|
---|
103 |
|
---|
104 |
|
---|
105 |
|
---|
106 |
|
---|
107 |
|
---|
108 |
|
---|
109 |
|
---|
110 |
|
---|
111 |
|
---|
112 |
|
---|
113 |
|
---|
114 |
|
---|
115 |
|
---|
116 |
|
---|
117 |
|
---|
118 |
|
---|
119 |
|
---|
120 |
|
---|
121 |
|
---|
122 |
|
---|
123 |
|
---|
124 |
|
---|
125 |
|
---|
126 |
|
---|
127 |
|
---|
128 |
|
---|
129 | Page 2 (printed 3/10/86)
|
---|
130 |
|
---|
131 |
|
---|
132 |
|
---|
133 |
|
---|
134 |
|
---|
135 |
|
---|
136 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
137 |
|
---|
138 |
|
---|
139 |
|
---|
140 | There are four patterns of input for the seven parameters
|
---|
141 | that can possibly give a correct result. They are given
|
---|
142 | below. P signifies positive integer (an input). ?
|
---|
143 | signifies either 0 (an unknown) or a positive integer (an
|
---|
144 | input).
|
---|
145 | P P P ? -- year
|
---|
146 | P ? P ? -- month of year
|
---|
147 | P ? ? ? -- day of month
|
---|
148 | ? ? P ? -- day of week
|
---|
149 | ? ? P ? -- week of month
|
---|
150 | ? P ? ? -- day of year
|
---|
151 | ? ? ? P -- julian day
|
---|
152 |
|
---|
153 | FFFFIIIILLLLEEEESSSS
|
---|
154 | none
|
---|
155 |
|
---|
156 | MMMMEEEETTTTHHHHOOOODDDD
|
---|
157 | The Gregorian Calendar was adopted starting October 15, 1582
|
---|
158 | (September 14, 1752 in Britain and her colonies). Dates
|
---|
159 | prior to adoption were in the Julian Calendar system (no
|
---|
160 | relation to julian days). Dates before the conversion are
|
---|
161 | denoted OS (old system); dates after the conversion are
|
---|
162 | denoted NS (new system). This program will extrapolate
|
---|
163 | Gregorian dates back to 1 AD although it will issue a
|
---|
164 | warning (inconsistent) for dates prior to the adoption of
|
---|
165 | the Gregorian calendar. 1 BC OS immediately preceded 1 AD
|
---|
166 | OS (no year 0) so the algorithms are invalid, even for
|
---|
167 | extrapolation, prior to 1 AD.
|
---|
168 |
|
---|
169 | The algorithms, some from the references below, are
|
---|
170 | tableless. The collection given here is valid from January
|
---|
171 | 1, 1 AD NS. The algorithms, which depend on a number of _a_d
|
---|
172 | _h_o_c functions over integers, are cryptic but the alternative
|
---|
173 | of using tables does not help much. The notation is C.
|
---|
174 | Logical values are to be interpreted as 1 == true and 0 ==
|
---|
175 | false. Where it is supposed that the names of the functions
|
---|
176 | are not sufficiently mnemonic, an italic comment is
|
---|
177 | appended. The code in gregorian.c is algebraically
|
---|
178 | simplified where possible when the functions below are back
|
---|
179 | substituted into other defining formulas. More than one
|
---|
180 | version is given for some formulas.
|
---|
181 |
|
---|
182 | LeapsBefore(y) == (y-1)/4 - (y-1)/100 + (y-1)/400 _l_e_a_p _y_e_a_r_s _b_e_t_w_e_e_n _1 _A_D _a_n_d _y_e_a_r _y
|
---|
183 |
|
---|
184 | Leap(y) == LeapsBefore(y+1) - LeapsBefore(y)
|
---|
185 |
|
---|
186 | Leap(y) == y%400 == 0 || (y%100 != 0 && y%4 == 0)
|
---|
187 |
|
---|
188 | StonesNumber(y, yd) == (yd + (yd>59+Leap(y))*(2-Leap(y)) + 91)*100
|
---|
189 |
|
---|
190 | DaysInYearBefore(m, y) == 3055*(m+2)/100 - 91 - (m>2)*(2-Leap(y))
|
---|
191 |
|
---|
192 |
|
---|
193 |
|
---|
194 |
|
---|
195 | Page 3 (printed 3/10/86)
|
---|
196 |
|
---|
197 |
|
---|
198 |
|
---|
199 |
|
---|
200 |
|
---|
201 |
|
---|
202 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
203 |
|
---|
204 |
|
---|
205 |
|
---|
206 | DayOfYear(y, m, d) == DaysInYearBefore(m, y) + d
|
---|
207 |
|
---|
208 | MonthOfYear(y, yd) == StonesNumber(y, yd)/3055 - 2
|
---|
209 |
|
---|
210 | DayOfMonth(y, yd) == StonesNumber(y, yd)%3055/100 + 1
|
---|
211 |
|
---|
212 | DaysInYear(y) == 365 + Leap(y)
|
---|
213 |
|
---|
214 | DaysInYear(y) == DaysInYearBefore(13, y)
|
---|
215 |
|
---|
216 | DaysInMonth(m, y) == ((m == 2) ? 28+Leap(y) : 30+(m==1 || m%5%3 != 1))
|
---|
217 |
|
---|
218 | DaysInMonth(m, y) == DaysInYearBefore(m+1, y) - DaysInYearBefore(m, y)
|
---|
219 |
|
---|
220 | JulianDaysB4(y) == (y-1)*365 + LeapsBefore(y) + 1721425
|
---|
221 |
|
---|
222 | JulianDay(y, m, d) == JulianDaysBefore(y) + DayOfYear(y, m, d)
|
---|
223 |
|
---|
224 | YearOf(jd) = 1 + (jd-=(17214256), jd-=(jd+1)/146097, jd+=(jd+1)/36524, jd-(jd+1)/1461)/365
|
---|
225 | _y_e_a_r _i_n _w_h_i_c_h _j_u_l_i_a_n _d_a_y _j_d _o_c_c_u_r_s
|
---|
226 | DayOf(jd) == jd - JulianDaysBefore(YearOf(jd))
|
---|
227 | _g_i_v_e_n _t_h_e _j_u_l_i_a_n _d_a_y _j_d, _d_a_y _o_f _y_e_a_r _f_r_o_m _1 _J_a_n
|
---|
228 |
|
---|
229 | WeekDay(jd) = (jd+1)%7+1 _S_u_n_d_a_y = _1, _e_t_c.
|
---|
230 |
|
---|
231 | Week(dm, dw) = (13 + dm - dw)/7
|
---|
232 | _w_e_e_k _o_f _m_o_n_t_h _f_r_o_m _d_a_y _o_f _m_o_n_t_h _a_n_d _d_a_y _o_f _w_e_e_k
|
---|
233 |
|
---|
234 | LLLLIIIIMMMMIIIITTTTSSSS
|
---|
235 | Inputs are converted by _a_t_o_i which does not check for non-
|
---|
236 | digits. The julian day is, by definition, bounded from
|
---|
237 | below by 2299161 (15 October, 1582). The program will fail
|
---|
238 | for implementations of C with _s_i_z_e_o_f (_l_o_n_g _i_n_t) < _4. There
|
---|
239 | is no practical upper limit on year or julian day. The
|
---|
240 | program extrapolates backward correctly to January 1, 1 AD
|
---|
241 | NS but reports the input is "inconsistent" prior to October
|
---|
242 | 15, 1582.
|
---|
243 |
|
---|
244 | SSSSEEEEEEEE AAAALLLLSSSSOOOO
|
---|
245 | 1. Any almanac, under calendar, perpetual. (Note the World
|
---|
246 | Almanac (1985, 1986) gives a julian day incorrect by one).
|
---|
247 |
|
---|
248 | 2. Any encyclopedia, under calendar.
|
---|
249 |
|
---|
250 | 3. The Astronomical Ephemeris (any year)
|
---|
251 |
|
---|
252 | 3. CAL(1). The information supplied by greg corresponds to
|
---|
253 | cal starting September 14, 1752 AD.
|
---|
254 |
|
---|
255 | 4. Elmore, Perpetual Calendar, Am.J.Phys.44,3 (May 1976) pp
|
---|
256 | 482-3.
|
---|
257 |
|
---|
258 |
|
---|
259 |
|
---|
260 |
|
---|
261 | Page 4 (printed 3/10/86)
|
---|
262 |
|
---|
263 |
|
---|
264 |
|
---|
265 |
|
---|
266 |
|
---|
267 |
|
---|
268 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
269 |
|
---|
270 |
|
---|
271 |
|
---|
272 | 5. Fliegel & Van Flandern, A Machine Algorithm for
|
---|
273 | Processing Calendar Dates, (letter to the editor) CACM 11,10
|
---|
274 | (October 1968) pg. 657.
|
---|
275 |
|
---|
276 | 6. Stone, Tableless Date Conversion. Algorithm 398.
|
---|
277 | Collected Algorithms from the CACM (rcvd Jan 1970) and a
|
---|
278 | Remark by Robertson (rcvd Dec 1970).
|
---|
279 |
|
---|
280 | 7. Tantzen, Conversions Between Calendar Date and Julian Day
|
---|
281 | Number, Algorithm 199. Collected Algorithms from the CACM
|
---|
282 | (August 1963).
|
---|
283 |
|
---|
284 | 8. Uspensky & Heaslet, Elementary Number Theory, McGraw-
|
---|
285 | Hill, (1939) p.206-221.
|
---|
286 |
|
---|
287 |
|
---|
288 |
|
---|
289 |
|
---|
290 |
|
---|
291 |
|
---|
292 |
|
---|
293 |
|
---|
294 |
|
---|
295 |
|
---|
296 |
|
---|
297 |
|
---|
298 |
|
---|
299 |
|
---|
300 |
|
---|
301 |
|
---|
302 |
|
---|
303 |
|
---|
304 |
|
---|
305 |
|
---|
306 |
|
---|
307 |
|
---|
308 |
|
---|
309 |
|
---|
310 |
|
---|
311 |
|
---|
312 |
|
---|
313 |
|
---|
314 |
|
---|
315 |
|
---|
316 |
|
---|
317 |
|
---|
318 |
|
---|
319 |
|
---|
320 |
|
---|
321 |
|
---|
322 |
|
---|
323 |
|
---|
324 |
|
---|
325 |
|
---|
326 |
|
---|
327 | Page 5 (printed 3/10/86)
|
---|
328 |
|
---|
329 |
|
---|
330 |
|
---|
331 | |
---|