diff options
Diffstat (limited to 'lisp/calendar/iso8601.el')
-rw-r--r-- | lisp/calendar/iso8601.el | 44 |
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. |