From: Paul Eggert Date: Thu, 16 Jan 2020 01:36:59 +0000 (-0800) Subject: parse-time-string now parses ISO 8601 format strings X-Git-Tag: archive/raspbian/1%29.2+1-2+rpi1^2~5^2~16^2~7131^2~138 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=07a4dd8e6aa2787f809d12aa99b8914af91ae2b3;p=emacs.git parse-time-string now parses ISO 8601 format strings * lisp/calendar/parse-time.el (parse-time-string): Parse strings in ISO 8601 format too (Bug#39001). (parse-time--rfc-822ish): New internal function, containing most of the old parse-time-string implementation. (parse-iso8601-time-string): Simplify, now that parse-time-string groks ISO 8601. --- diff --git a/etc/NEWS b/etc/NEWS index 0e43c321d81..3d5915a3774 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -70,6 +70,9 @@ called when the function object is garbage-collected. Use 'set_function_finalizer' to set the finalizer and 'get_function_finalizer' to retrieve it. +** 'parse-time-string' can now parse ISO 8601 format strings, +such as "2020-01-15T16:12:21-08:00". + * Changes in Emacs 28.1 on Non-Free Operating Systems diff --git a/lisp/calendar/parse-time.el b/lisp/calendar/parse-time.el index 7110a81f0de..4d4f88efffb 100644 --- a/lisp/calendar/parse-time.el +++ b/lisp/calendar/parse-time.el @@ -149,13 +149,20 @@ letters, digits, plus or minus signs or colons." ;;;###autoload (defun parse-time-string (string) "Parse the time in STRING into (SEC MIN HOUR DAY MON YEAR DOW DST TZ). -STRING should be something resembling an RFC 822 (or later) date-time, e.g., -\"Fri, 25 Mar 2016 16:24:56 +0100\", but this function is +STRING should be an ISO 8601 time string, e.g., \"2020-01-15T16:12:21-08:00\", +or something resembling an RFC 822 (or later) date-time, e.g., +\"Wed, 15 Jan 2020 16:12:21 -0800\". This function is somewhat liberal in what format it accepts, and will attempt to return a \"likely\" value even for somewhat malformed strings. The values returned are identical to those of `decode-time', but any unknown values other than DST are returned as nil, and an unknown DST value is returned as -1." + (condition-case () + (decoded-time-set-defaults (iso8601-parse string)) + (wrong-type-argument + (parse-time--rfc-822ish string)))) + +(defun parse-time--rfc-822ish (string) (let ((time (list nil nil nil nil nil nil nil -1 nil)) (temp (parse-time-tokenize (downcase string)))) (while temp @@ -196,15 +203,11 @@ unknown DST value is returned as -1." time)) (defun parse-iso8601-time-string (date-string) - "Parse an ISO 8601 time string, such as 2016-12-01T23:35:06-05:00. -If DATE-STRING cannot be parsed, it falls back to -`parse-time-string'." - (when-let ((time - (if (iso8601-valid-p date-string) - (decoded-time-set-defaults (iso8601-parse date-string)) - ;; Fall back to having `parse-time-string' do fancy - ;; things for us. - (parse-time-string date-string)))) + "Parse an ISO 8601 time string, such as \"2020-01-15T16:12:21-08:00\". +Fall back on parsing something resembling an RFC 822 (or later) date-time. +This function is like `parse-time-string' except that it returns +a Lisp timestamp when successful." + (when-let ((time (parse-time-string date-string))) (encode-time time))) (provide 'parse-time)