diff options
| author | Edward M. Reingold | 1995-09-21 02:46:47 +0000 |
|---|---|---|
| committer | Edward M. Reingold | 1995-09-21 02:46:47 +0000 |
| commit | 8a45b040852b7982ed0c205553219efba66092a0 (patch) | |
| tree | 9684a84f26c874d2a5afed6db320a01ab7d65e8c | |
| parent | 32933edb9a901b58585f2350732698a822189482 (diff) | |
| download | emacs-8a45b040852b7982ed0c205553219efba66092a0.tar.gz emacs-8a45b040852b7982ed0c205553219efba66092a0.zip | |
Added code to support Chinese calendar.
| -rw-r--r-- | lisp/calendar/lunar.el | 144 |
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 | |||
| 366 | The date and time are local time, including any daylight savings rules, | ||
| 367 | as governed by the values of calendar-daylight-savings-starts, | ||
| 368 | calendar-daylight-savings-starts-time, calendar-daylight-savings-ends, | ||
| 369 | calendar-daylight-savings-ends-time, calendar-daylight-time-offset, and | ||
| 370 | calendar-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 |