1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-14 11:42:29 -08:00

(solar-holidays): Use new

calendar-daylight-savings-{starts,ends}-time vars instead of old
calendar-daylight-savings-switchover-time var.

(calendar-last-day-of-month): Tune by testing month before year.
(calendar-absolute-from-gregorian): Tune by computing (1- year) once.

(calendar-nth-named-absday): New function, used to improve performance
in calendar-time-zone-daylight-rules.
(calendar-nth-named-day): Use it.
This commit is contained in:
Paul Eggert 1993-08-28 04:14:25 +00:00
parent c27a1f512c
commit 04d5d338d2

View file

@ -752,7 +752,7 @@ See the documentation for `calendar-holidays' for details.")
'(format "Daylight Savings Time Begins %s"
(if (fboundp 'atan)
(solar-time-string
(/ calendar-daylight-savings-switchover-time
(/ calendar-daylight-savings-starts-time
(float 60))
date
'standard)
@ -763,7 +763,7 @@ See the documentation for `calendar-holidays' for details.")
'(format "Daylight Savings Time Ends %s"
(if (fboundp 'atan)
(solar-time-string
(/ (- calendar-daylight-savings-switchover-time
(/ (- calendar-daylight-savings-ends-time
calendar-daylight-time-offset)
(float 60))
date
@ -978,13 +978,13 @@ Forward if N is positive or backward if N is negative."
(defmacro calendar-last-day-of-month (month year)
"The last day in MONTH during YEAR."
(` (if (and
(, (macroexpand (` (calendar-leap-year-p (, year)))))
(= (, month) 2))
(= (, month) 2)
(, (macroexpand (` (calendar-leap-year-p (, year))))))
29
(aref [31 28 31 30 31 30 31 31 30 31 30 31] (1- (, month))))))
;;(defun calendar-last-day-of-month (month year)
;; "The last day in MONTH during YEAR."
;; (if (and (calendar-leap-year-p year) (= month 2))
;; (if (and (= month 2) (calendar-leap-year-p year))
;; 29
;; (aref [31 28 31 30 31 30 31 31 30 31 30 31] (1- month))))
@ -1024,21 +1024,22 @@ while (calendar-day-number '(12 31 1980)) returns 366."
(defmacro calendar-absolute-from-gregorian (date)
"The number of days elapsed between the Gregorian date 12/31/1 BC and DATE.
The Gregorian date Sunday, December 31, 1 BC is imaginary."
(` (let ((year (, (macroexpand (` (extract-calendar-year (, date)))))))
(` (let ((prior-years
(1- (, (macroexpand (` (extract-calendar-year (, date))))))))
(+ (, (macroexpand (` (calendar-day-number (, date)))));; Days this year
(* 365 (1- year));; + Days in prior years
(/ (1- year) 4);; + Julian leap years
(- (/ (1- year) 100));; - century years
(/ (1- year) 400)))));; + Gregorian leap years
(* 365 prior-years);; + Days in prior years
(/ prior-years 4);; + Julian leap years
(- (/ prior-years 100));; - century years
(/ prior-years 400)))));; + Gregorian leap years
;;(defun calendar-absolute-from-gregorian (date)
;; "The number of days elapsed between the Gregorian date 12/31/1 BC and DATE.
;;The Gregorian date Sunday, December 31, 1 BC is imaginary."
;; (let ((year (extract-calendar-year date)))
;; (let ((prior-years (1- (extract-calendar-year date))))
;; (+ (calendar-day-number date);; Days this year
;; (* 365 (1- year));; + Days in prior years
;; (/ (1- year) 4);; + Julian leap years
;; (- (/ (1- year) 100));; - century years
;; (/ (1- year) 400))));; + Gregorian leap years
;; (* 365 prior-years);; + Days in prior years
;; (/ prior-years 4);; + Julian leap years
;; (- (/ prior-years 100));; - century years
;; (/ prior-years 400))));; + Gregorian leap years
;;;###autoload
(defun calendar (&optional arg)
@ -1493,19 +1494,19 @@ the inserted text. Value is always t."
The commands for cursor movement are:\\<calendar-mode-map>
\\[calendar-forward-day] one day forward \\[calendar-backward-day] one day backward
\\[calendar-forward-week] one week forward \\[calendar-backward-week] one week backward
\\[calendar-forward-day] one day forward \\[calendar-backward-day] one day backward
\\[calendar-forward-week] one week forward \\[calendar-backward-week] one week backward
\\[calendar-forward-month] one month forward \\[calendar-backward-month] one month backward
\\[calendar-forward-year] one year forward \\[calendar-backward-year] one year backward
\\[calendar-beginning-of-week] beginning of week \\[calendar-end-of-week] end of week
\\[calendar-forward-year] one year forward \\[calendar-backward-year] one year backward
\\[calendar-beginning-of-week] beginning of week \\[calendar-end-of-week] end of week
\\[calendar-beginning-of-month] beginning of month \\[calendar-end-of-month] end of month
\\[calendar-beginning-of-year] beginning of year \\[calendar-end-of-year] end of year
\\[calendar-goto-date] go to date
\\[calendar-goto-julian-date] go to Julian date \\[calendar-goto-astro-day-number] go to astronomical (Julian) day number
\\[calendar-goto-hebrew-date] go to Hebrew date \\[calendar-goto-islamic-date] go to Islamic date
\\[calendar-goto-iso-date] go to ISO date \\[calendar-goto-french-date] go to French Revolutionary date
\\[calendar-goto-julian-date] go to Julian date \\[calendar-goto-astro-day-number] go to astronomical (Julian) day number
\\[calendar-goto-hebrew-date] go to Hebrew date \\[calendar-goto-islamic-date] go to Islamic date
\\[calendar-goto-iso-date] go to ISO date \\[calendar-goto-french-date] go to French Revolutionary date
\\[calendar-goto-mayan-long-count-date] go to Mayan Long Count date
\\[calendar-next-haab-date] go to next occurrence of Mayan Haab date
@ -1525,9 +1526,9 @@ You can determine the number of days (inclusive) between the point and mark by
The commands for calendar movement are:
\\[scroll-calendar-right] scroll one month right \\[scroll-calendar-left] scroll one month left
\\[scroll-calendar-right] scroll one month right \\[scroll-calendar-left] scroll one month left
\\[scroll-calendar-right-three-months] scroll 3 months right \\[scroll-calendar-left-three-months] scroll 3 months left
\\[calendar-current-month] display current month \\[calendar-other-month] display another month
\\[calendar-current-month] display current month \\[calendar-other-month] display another month
Whenever it makes sense, the above commands take prefix arguments that
multiply their affect. For convenience, the digit keys and the minus sign
@ -1636,13 +1637,14 @@ To find the times of sunrise and sunset and lunar phases use
\\[calendar-sunrise-sunset] show times of sunrise and sunset
\\[calendar-phases-of-moon] show times of quarters of the moon
The times given will be at latitude `solar-latitude', longitude
`solar-longitude' in time zone `solar-time-zone'. These variables, and the
variables `solar-location-name', `solar-standard-time-zone-name',
`solar-daylight-time-zone-name', `solar-daylight-savings-starts',
`solar-daylight-savings-ends', `calendar-daylight-time-offset',
and `calendar-daylight-savings-switchover-time' should be set for
your location.
The times given will be for location `calendar-location-name' at latitude
`calendar-latitude', longitude `calendar-longitude'; set these variables for
your location. The following variables are also consulted, and you must set
them if your system does not initialize them properly: `calendar-time-zone',
`calendar-daylight-time-offset', `calendar-standard-time-zone-name',
`calendar-daylight-time-zone-name', `calendar-daylight-savings-starts',
`calendar-daylight-savings-ends', `calendar-daylight-savings-starts-time',
`calendar-daylight-savings-ends-time'.
To exit from the calendar use
@ -2549,6 +2551,27 @@ absolute date d, applying it to d-1 gives the DAYNAME previous to absolute
date d, and applying it to d+7 gives the DAYNAME following absolute date d."
(- date (% (- date dayname) 7)))
(defun calendar-nth-named-absday (n dayname month year &optional day)
"The absolute date of Nth DAYNAME in MONTH, YEAR before/after optional DAY.
A DAYNAME of 0 means Sunday, 1 means Monday, and so on. If N<0,
return the Nth DAYNAME before MONTH DAY, YEAR (inclusive).
If N>0, return the Nth DAYNAME after MONTH DAY, YEAR (inclusive).
If DAY is omitted, it defaults to 1 if N>0, and MONTH's last day otherwise."
(if (> n 0)
(+ (* 7 (1- n))
(calendar-dayname-on-or-before
dayname
(+ 6 (calendar-absolute-from-gregorian
(list month (or day 1) year)))))
(+ (* 7 (1+ n))
(calendar-dayname-on-or-before
dayname
(calendar-absolute-from-gregorian
(list month
(or day (calendar-last-day-of-month month year))
year))))))
(defun calendar-nth-named-day (n dayname month year &optional day)
"The date of Nth DAYNAME in MONTH, YEAR before/after optional DAY.
A DAYNAME of 0 means Sunday, 1 means Monday, and so on. If N<0,
@ -2557,19 +2580,7 @@ If N>0, return the Nth DAYNAME after MONTH DAY, YEAR (inclusive).
If DAY is omitted, it defaults to 1 if N>0, and MONTH's last day otherwise."
(calendar-gregorian-from-absolute
(if (> n 0)
(+ (* 7 (1- n))
(calendar-dayname-on-or-before
dayname
(+ 6 (calendar-absolute-from-gregorian
(list month (or day 1) year)))))
(+ (* 7 (1+ n))
(calendar-dayname-on-or-before
dayname
(calendar-absolute-from-gregorian
(list month
(or day (calendar-last-day-of-month month year))
year)))))))
(calendar-nth-named-absday n dayname month year day)))
(defun calendar-print-day-of-year ()
"Show the day number in the year and the number of days remaining in the