Function: calendar-next-time-zone-transition

calendar-next-time-zone-transition is a byte-compiled function defined in cal-dst.el.gz.

Signature

(calendar-next-time-zone-transition TIME)

Documentation

Return the time of the next time zone transition after TIME.

Both TIME and the result are acceptable arguments to current-time-zone. Return nil if no such transition can be found.

Probably introduced at or before Emacs version 25.1.

Source Code

;; Defined in /usr/src/emacs/lisp/calendar/cal-dst.el.gz
(defun calendar-next-time-zone-transition (time)
  "Return the time of the next time zone transition after TIME.
Both TIME and the result are acceptable arguments to `current-time-zone'.
Return nil if no such transition can be found."
  (let* ((time (time-convert time 'integer))
         (time-zone (current-time-zone time))
         (time-utc-diff (car time-zone))
         hi
         hi-zone
         (hi-utc-diff time-utc-diff)
         (quarter-seconds 7889238) ; Average seconds per 1/4 Gregorian year.
         (quarters '(2 1 3)))
    ;; Heuristic: probe the time zone offset in the next three calendar
    ;; quarters, looking for a time zone offset different from TIME.
    (while (and quarters (eq time-utc-diff hi-utc-diff))
      (setq hi (+ time (* (car quarters) quarter-seconds))
            hi-zone (current-time-zone hi)
            hi-utc-diff (car hi-zone)
            quarters (cdr quarters)))
    (and
     time-utc-diff
     hi-utc-diff
     (not (eq time-utc-diff hi-utc-diff))
     ;; Now HI is after the next time zone transition.
     ;; Set LO to TIME, and then binary search to increase LO and decrease HI
     ;; until LO is just before and HI is just after the time zone transition.
     (let* ((lo time)
            probe)
       (while
           ;; Set PROBE to halfway between LO and HI, rounding down.
           ;; If PROBE equals LO, we are done.
           (not (= lo (setq probe (floor (+ lo hi) 2))))
         ;; Set either LO or HI to PROBE, depending on probe results.
         (if (eq (car (current-time-zone probe)) hi-utc-diff)
             (setq hi probe)
           (setq lo probe)))
       hi))))