aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdward M. Reingold1995-09-21 02:46:47 +0000
committerEdward M. Reingold1995-09-21 02:46:47 +0000
commit8a45b040852b7982ed0c205553219efba66092a0 (patch)
tree9684a84f26c874d2a5afed6db320a01ab7d65e8c
parent32933edb9a901b58585f2350732698a822189482 (diff)
downloademacs-8a45b040852b7982ed0c205553219efba66092a0.tar.gz
emacs-8a45b040852b7982ed0c205553219efba66092a0.zip
Added code to support Chinese calendar.
-rw-r--r--lisp/calendar/lunar.el144
1 files changed, 141 insertions, 3 deletions
diff --git a/lisp/calendar/lunar.el b/lisp/calendar/lunar.el
index 3167135d445..ab2cd6e4bc4 100644
--- a/lisp/calendar/lunar.el
+++ b/lisp/calendar/lunar.el
@@ -1,6 +1,6 @@
1;;; lunar.el --- calendar functions for phases of the moon. 1;;; lunar.el --- calendar functions for phases of the moon.
2 2
3;; Copyright (C) 1992, 1993 Free Software Foundation, Inc. 3;; Copyright (C) 1992, 1993, 1995 Free Software Foundation, Inc.
4 4
5;; Author: Edward M. Reingold <reingold@cs.uiuc.edu> 5;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
6;; Keywords: calendar 6;; Keywords: calendar
@@ -28,7 +28,8 @@
28;; diary.el. 28;; diary.el.
29 29
30;; Based on ``Astronomical Formulae for Calculators,'' 3rd ed., by Jean Meeus, 30;; Based on ``Astronomical Formulae for Calculators,'' 3rd ed., by Jean Meeus,
31;; Willmann-Bell, Inc., 1985. 31;; Willmann-Bell, Inc., 1985 and ``Astronomical Algorithms'' by Jean Meeus,
32;; Willmann-Bell, Inc., 1991.
32;; 33;;
33;; WARNING: The calculations will be accurate only to within a few minutes. 34;; WARNING: The calculations will be accurate only to within a few minutes.
34 35
@@ -167,7 +168,7 @@ remainder mod 4 gives the phase: 0 new moon, 1 first quarter, 2 full moon,
167 60.0 24.0))) 168 60.0 24.0)))
168 (time (* 24 (- date (truncate date)))) 169 (time (* 24 (- date (truncate date))))
169 (date (calendar-gregorian-from-absolute (truncate date))) 170 (date (calendar-gregorian-from-absolute (truncate date)))
170 (adj (solar-adj-time-for-dst date time))) 171 (adj (dst-adjust-time date time)))
171 (list (car adj) (apply 'solar-time-string (cdr adj)) phase))) 172 (list (car adj) (apply 'solar-time-string (cdr adj)) phase)))
172 173
173(defun lunar-phase-name (phase) 174(defun lunar-phase-name (phase)
@@ -247,6 +248,143 @@ This function is suitable for execution in a .emacs file."
247 (concat (lunar-phase-name (car (cdr (cdr phase)))) " " 248 (concat (lunar-phase-name (car (cdr (cdr phase)))) " "
248 (car (cdr phase)))))) 249 (car (cdr phase))))))
249 250
251
252;; For the Chinese calendar the calculations for the new moon need to be more
253;; accurate than those above, so we use more terms in the approximation.
254
255(defun lunar-new-moon-time (k)
256 "Astronomical (Julian) day number of K th new moon."
257 (let* ((T (/ k 1236.85))
258 (T2 (* T T))
259 (T3 (* T T T))
260 (T4 (* T2 T2))
261 (JDE (+ 2451550.09765
262 (* 29.530588853 k)
263 (* 0.0001337 T2)
264 (* -0.000000150 T3)
265 (* 0.00000000073 T4)))
266 (E (- 1 (* 0.002516 T) (* 0.0000074 T2)))
267 (sun-anomaly (+ 2.5534
268 (* 29.10535669 k)
269 (* -0.0000218 T2)
270 (* -0.00000011 T3)))
271 (moon-anomaly (+ 201.5643
272 (* 385.81693528 k)
273 (* 0.0107438 T2)
274 (* 0.00001239 T3)
275 (* -0.000000058 T4)))
276 (moon-argument (+ 160.7108
277 (* 390.67050274 k)
278 (* -0.0016341 T2)
279 (* -0.00000227 T3)
280 (* 0.000000011 T4)))
281 (omega (+ 124.7746
282 (* -1.56375580 k)
283 (* 0.0020691 T2)
284 (* 0.00000215 T3)))
285 (A1 (+ 299.77 (* 0.107408 k) (* -0.009173 T2)))
286 (A2 (+ 251.88 (* 0.016321 k)))
287 (A3 (+ 251.83 (* 26.641886 k)))
288 (A4 (+ 349.42 (* 36.412478 k)))
289 (A5 (+ 84.66 (* 18.206239 k)))
290 (A6 (+ 141.74 (* 53.303771 k)))
291 (A7 (+ 207.14 (* 2.453732 k)))
292 (A8 (+ 154.84 (* 7.306860 k)))
293 (A9 (+ 34.52 (* 27.261239 k)))
294 (A10 (+ 207.19 (* 0.121824 k)))
295 (A11 (+ 291.34 (* 1.844379 k)))
296 (A12 (+ 161.72 (* 24.198154 k)))
297 (A13 (+ 239.56 (* 25.513099 k)))
298 (A14 (+ 331.55 (* 3.592518 k)))
299 (correction
300 (+ (* -0.40720 (solar-sin-degrees moon-anomaly))
301 (* 0.17241 E (solar-sin-degrees sun-anomaly))
302 (* 0.01608 (solar-sin-degrees (* 2 moon-anomaly)))
303 (* 0.01039 (solar-sin-degrees (* 2 moon-argument)))
304 (* 0.00739 E (solar-sin-degrees (- moon-anomaly sun-anomaly)))
305 (* -0.00514 E (solar-sin-degrees (+ moon-anomaly sun-anomaly)))
306 (* 0.00208 E E (solar-sin-degrees (* 2 sun-anomaly)))
307 (* -0.00111 (solar-sin-degrees
308 (- moon-anomaly (* 2 moon-argument))))
309 (* -0.00057 (solar-sin-degrees
310 (+ moon-anomaly (* 2 moon-argument))))
311 (* 0.00056 E (solar-sin-degrees
312 (+ (* 2 moon-anomaly) sun-anomaly)))
313 (* -0.00042 (solar-sin-degrees (* 3 moon-anomaly)))
314 (* 0.00042 E (solar-sin-degrees
315 (+ sun-anomaly (* 2 moon-argument))))
316 (* 0.00038 E (solar-sin-degrees
317 (- sun-anomaly (* 2 moon-argument))))
318 (* -0.00024 E (solar-sin-degrees
319 (- (* 2 moon-anomaly) sun-anomaly)))
320 (* -0.00017 (solar-sin-degrees omega))
321 (* -0.00007 (solar-sin-degrees
322 (+ moon-anomaly (* 2 sun-anomaly))))
323 (* 0.00004 (solar-sin-degrees
324 (- (* 2 moon-anomaly) (* 2 moon-argument))))
325 (* 0.00004 (solar-sin-degrees (* 3 sun-anomaly)))
326 (* 0.00003 (solar-sin-degrees (+ moon-anomaly sun-anomaly
327 (* -2 moon-argument))))
328 (* 0.00003 (solar-sin-degrees
329 (+ (* 2 moon-anomaly) (* 2 moon-argument))))
330 (* -0.00003 (solar-sin-degrees (+ moon-anomaly sun-anomaly
331 (* 2 moon-argument))))
332 (* 0.00003 (solar-sin-degrees (- moon-anomaly sun-anomaly
333 (* -2 moon-argument))))
334 (* -0.00002 (solar-sin-degrees (- moon-anomaly sun-anomaly
335 (* 2 moon-argument))))
336 (* -0.00002 (solar-sin-degrees
337 (+ (* 3 moon-anomaly) sun-anomaly)))
338 (* 0.00002 (solar-sin-degrees (* 4 moon-anomaly)))))
339 (additional
340 (+ (* 0.000325 (solar-sin-degrees A1))
341 (* 0.000165 (solar-sin-degrees A2))
342 (* 0.000164 (solar-sin-degrees A3))
343 (* 0.000126 (solar-sin-degrees A4))
344 (* 0.000110 (solar-sin-degrees A5))
345 (* 0.000062 (solar-sin-degrees A6))
346 (* 0.000060 (solar-sin-degrees A7))
347 (* 0.000056 (solar-sin-degrees A8))
348 (* 0.000047 (solar-sin-degrees A9))
349 (* 0.000042 (solar-sin-degrees A10))
350 (* 0.000040 (solar-sin-degrees A11))
351 (* 0.000037 (solar-sin-degrees A12))
352 (* 0.000035 (solar-sin-degrees A13))
353 (* 0.000023 (solar-sin-degrees A14))))
354 (newJDE (+ JDE correction additional)))
355 (+ newJDE
356 (- (solar-ephemeris-correction
357 (extract-calendar-year
358 (calendar-gregorian-from-absolute
359 (floor (calendar-absolute-from-astro newJDE))))))
360 (/ calendar-time-zone 60.0 24.0))))
361
362(defun lunar-new-moon-on-or-after (d)
363 "Astronomical (Julian) day number of first new moon on or after astronomical
364(Julian) day number d. The fractional part is the time of day.
365
366The date and time are local time, including any daylight savings rules,
367as governed by the values of calendar-daylight-savings-starts,
368calendar-daylight-savings-starts-time, calendar-daylight-savings-ends,
369calendar-daylight-savings-ends-time, calendar-daylight-time-offset, and
370calendar-time-zone."
371 (let* ((date (calendar-gregorian-from-absolute
372 (floor (calendar-absolute-from-astro d))))
373 (year (+ (extract-calendar-year date)
374 (/ (calendar-day-number date) 365.25)))
375 (k (floor (* (- year 2000.0) 12.3685)))
376 (date (lunar-new-moon-time k)))
377 (while (< date d)
378 (setq k (1+ k))
379 (setq date (lunar-new-moon-time k)))
380 (let* ((a-date (calendar-absolute-from-astro date))
381 (time (* 24 (- a-date (truncate a-date))))
382 (date (calendar-gregorian-from-absolute (truncate a-date)))
383 (adj (dst-adjust-time date time)))
384 (calendar-astro-from-absolute
385 (+ (calendar-absolute-from-gregorian (car adj))
386 (/ (car (cdr adj)) 24.0))))))
387
250(provide 'lunar) 388(provide 'lunar)
251 389
252;;; lunar.el ends here 390;;; lunar.el ends here