summaryrefslogtreecommitdiff
path: root/lisp/calendar/iso8601.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/calendar/iso8601.el')
-rw-r--r--lisp/calendar/iso8601.el44
1 files changed, 27 insertions, 17 deletions
diff --git a/lisp/calendar/iso8601.el b/lisp/calendar/iso8601.el
index 5952586cc86..83b57a4f56a 100644
--- a/lisp/calendar/iso8601.el
+++ b/lisp/calendar/iso8601.el
@@ -56,11 +56,11 @@
(defconst iso8601--date-match
(iso8601--concat-regexps
(list iso8601--year-match
- iso8601--full-date-match
- iso8601--without-day-match
- iso8601--outdated-date-match
- iso8601--week-date-match
- iso8601--ordinal-date-match)))
+ iso8601--full-date-match
+ iso8601--without-day-match
+ iso8601--outdated-date-match
+ iso8601--week-date-match
+ iso8601--ordinal-date-match)))
(defconst iso8601--time-match
"\\([0-9][0-9]\\):?\\([0-9][0-9]\\)?:?\\([0-9][0-9]\\)?\\.?\\([0-9][0-9][0-9]\\)?")
@@ -68,6 +68,10 @@
(defconst iso8601--zone-match
"\\(Z\\|\\([-+]\\)?\\([0-9][0-9]\\):?\\([0-9][0-9]\\)?\\)")
+(defconst iso8601--full-time-match
+ (concat "\\(" (replace-regexp-in-string "(" "(?:" iso8601--time-match) "\\)"
+ "\\(" iso8601--zone-match "\\)?"))
+
(defconst iso8601--combined-match
(concat "\\(" iso8601--date-match "\\)"
"\\(?:T\\("
@@ -195,19 +199,25 @@ well as variants like \"2008W32\" (week number) and
(defun iso8601-parse-time (string)
"Parse STRING, which should be an ISO 8601 time string, and return a time value."
- (if (not (iso8601--match iso8601--time-match string))
+ (if (not (iso8601--match iso8601--full-time-match string))
(signal 'wrong-type-argument string)
- (let ((hour (string-to-number (match-string 1 string)))
- (minute (and (match-string 2 string)
- (string-to-number (match-string 2 string))))
- (second (and (match-string 3 string)
- (string-to-number (match-string 3 string))))
- ;; Hm...
- (_millisecond (and (match-string 4 string)
- (string-to-number (match-string 4 string)))))
- (iso8601--decoded-time :hour hour
- :minute (or minute 0)
- :second (or second 0)))))
+ (let ((time (match-string 1 string))
+ (zone (match-string 2 string)))
+ (if (not (iso8601--match iso8601--time-match time))
+ (signal 'wrong-type-argument string)
+ (let ((hour (string-to-number (match-string 1 time)))
+ (minute (and (match-string 2 time)
+ (string-to-number (match-string 2 time))))
+ (second (and (match-string 3 time)
+ (string-to-number (match-string 3 time))))
+ ;; Hm...
+ (_millisecond (and (match-string 4 time)
+ (string-to-number (match-string 4 time)))))
+ (iso8601--decoded-time :hour hour
+ :minute (or minute 0)
+ :second (or second 0)
+ :zone (and zone
+ (iso8601-parse-zone zone))))))))
(defun iso8601-parse-zone (string)
"Parse STRING, which should be an ISO 8601 time zone.