Function: icalendar-recur-find-weekly-interval

icalendar-recur-find-weekly-interval is a byte-compiled function defined in icalendar-recur.el.gz.

Signature

(icalendar-recur-find-weekly-interval TARGET DTSTART INTERVALSIZE &optional WEEKSTART VTIMEZONE)

Documentation

Find a WEEKLY recurrence interval.

See icalendar-recur-find-interval for arguments' meanings.

Source Code

;; Defined in /usr/src/emacs/lisp/calendar/icalendar-recur.el.gz
(defun icr:find-weekly-interval (target dtstart intervalsize
                                 &optional weekstart vtimezone)
  "Find a WEEKLY recurrence interval.
See `icalendar-recur-find-interval' for arguments' meanings."
  (let* ((target-date (ical:date/time-to-date target))
         (start-date (ical:date/time-to-date dtstart))
         ;; the absolute dates of the week start before target and
         ;; dtstart; these are always a whole number of weeks apart:
         (target-week-abs (calendar-nth-named-absday
                           -1
                           (or weekstart 1)
                           (calendar-extract-month target-date)
                           (calendar-extract-year target-date)
                           (calendar-extract-day target-date)))
         (start-abs (calendar-nth-named-absday
                     -1
                     (or weekstart 1)
                     (calendar-extract-month start-date)
                     (calendar-extract-year start-date)
                     (calendar-extract-day start-date)))
         (intsize-days (* 7 intervalsize))
         ;; the absolute date of the week start before target which is
         ;; an integer multiple of intervalsize weeks from dtstart:
         (low-abs (- target-week-abs
                  (mod (- target-week-abs start-abs) intsize-days)))
         ;; then use this to find the interval bounds:
         (low (ical:date-to-date-time
               (calendar-gregorian-from-absolute low-abs)))
         (high (ical:date-to-date-time
               (calendar-gregorian-from-absolute (+ 7 low-abs))))
         (next-low
          (when (< 1 intervalsize)
            (ical:date-to-date-time
             (calendar-gregorian-from-absolute (+ intsize-days low-abs))))))

    (when vtimezone
      (icr:tz-set-zone low vtimezone)
      (icr:tz-set-zone high vtimezone)
      (when next-low
        (icr:tz-set-zone next-low vtimezone)))

    ;; Return the bounds:
    (icr:make-interval low high next-low)))