Don't Modify the World

14/07/2015

Emacs comes with a few thousand lines of code for calendar calculations. Surely timezone calculations must be a properly solved problem as well! At least, that’s what one would expect given the existence of the very handy M-x display-time-world. Except, it’s not:

(defun display-time-world-display (alist)
  "Replace current buffer text with times in various zones, based on ALIST."
  (let ((inhibit-read-only t)
        (buffer-undo-list t)
        (old-tz (getenv "TZ"))
        (max-width 0)
        result fmt)
    (erase-buffer)
    (unwind-protect
        (dolist (zone alist)
          (let* ((label (cadr zone))
                 (width (string-width label)))
            (setenv "TZ" (car zone))
            (push (cons label
                        (format-time-string display-time-world-time-format))
                  result)
            (when (> width max-width)
              (setq max-width width))))
      (setenv "TZ" old-tz))
    (setq fmt (concat "%-" (int-to-string max-width) "s %s\n"))
    (dolist (timedata (nreverse result))
      (insert (format fmt (car timedata) (cdr timedata))))
    (delete-char -1)))

Tough luck if all you’ve done was customizing Emacs’ current idea of the timezone like wgreenhouse did. Ouch.

edit: Looks like this got fixed properly!