summaryrefslogtreecommitdiff
path: root/lisp/calendar
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2020-01-15 17:36:59 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2020-01-15 17:42:11 -0800
commit07a4dd8e6aa2787f809d12aa99b8914af91ae2b3 (patch)
tree10e020a7600bfd4f431198cbb40682707c91c594 /lisp/calendar
parenta70feb0d730e5c70d7f75cff4fea66ec2ddf38dd (diff)
downloademacs-07a4dd8e6aa2787f809d12aa99b8914af91ae2b3.tar.gz
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.
Diffstat (limited to 'lisp/calendar')
-rw-r--r--lisp/calendar/parse-time.el25
1 files changed, 14 insertions, 11 deletions
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)