many thanks to both of you. Yours was very interesting to read, Thomas, but ts makes it quite a bit easier to write:

(defun o-l-date-to-timestamp (date)
  "use ts.el date parse functions return an ISO-compatible
timestamp for transmission to Canvas via API. DATE is a string,
usually of the form `2019-09-26`, but optionally including a full time."

  (ts-format "%Y-%m-%dT%H:%M:%S%:z" (ts-parse-fill 'end date )))

I'm quite looking forward to using dash, s, ts, kv, etc to simplify my often very obtuse legacy code. 


On Sun, Sep 22, 2019 at 6:10 AM Thomas Plass <thunk2@arcor.de> wrote:
Hi,

Matt Price wrote at 16:27 on September 21, 2019:
:
: :DUE_AT: 2019-09-26
:
: ...
:
: I'm wondering though how hard
: it would be to get the current time zone -- or the time zone that the course is taught in -- from
: emacs, and construct the string from that value. 

This'll return the offset suffix (if that's what you want) when
executed in your local time zone (presumably "-04:00"):

(defun Price/local-time-offset-from-iso-date (y-m-d)
  (let* ((ymd (mapcar (lambda (s) (string-to-number s)) (split-string y-m-d "-")))
         (offsecs (nth 8
                       (decode-time
                        (apply #'encode-time
                               (list 59 59 23 (nth 2 ymd) (nth 1 ymd) (nth 0 ymd)))))))
    (format "%s%02d:%02d"
            (if (> offsecs 0) "+" "-")
            (/ offsecs 3600)
            (% offsecs 3600))))

On Unix, this'll always work.  On Windows, it works most of the time,
but may fail in the weeks around switches from and to daylight saving.

Thomas