Function: icalendar--decode-isoduration
icalendar--decode-isoduration is a byte-compiled function defined in
icalendar.el.gz.
Signature
(icalendar--decode-isoduration ISODURATIONSTRING &optional DURATION-CORRECTION)
Documentation
Convert ISODURATIONSTRING into format provided by decode-time.
Converts from ISO-8601 to Emacs representation. If ISODURATIONSTRING specifies UTC time (trailing letter Z) the decoded time is given in the local time zone!
Optional argument DURATION-CORRECTION shortens result by one day.
FIXME: TZID-attributes are ignored....! FIXME: multiple comma-separated values should be allowed!
Source Code
;; Defined in /usr/src/emacs/lisp/calendar/icalendar.el.gz
(defun icalendar--decode-isoduration (isodurationstring
&optional duration-correction)
"Convert ISODURATIONSTRING into format provided by `decode-time'.
Converts from ISO-8601 to Emacs representation. If ISODURATIONSTRING
specifies UTC time (trailing letter Z) the decoded time is given in
the local time zone!
Optional argument DURATION-CORRECTION shortens result by one day.
FIXME: TZID-attributes are ignored....!
FIXME: multiple comma-separated values should be allowed!"
(if isodurationstring
(save-match-data
(string-match
(concat
"^P[+-]?\\("
"\\(\\([0-9]+\\)D\\)" ; days only
"\\|"
"\\(\\(\\([0-9]+\\)D\\)?T\\(\\([0-9]+\\)H\\)?" ; opt days
"\\(\\([0-9]+\\)M\\)?\\(\\([0-9]+\\)S\\)?\\)" ; mand. time
"\\|"
"\\(\\([0-9]+\\)W\\)" ; weeks only
"\\)$") isodurationstring)
(let ((seconds 0)
(minutes 0)
(hours 0)
(days 0)
(months 0)
(years 0))
(cond
((match-beginning 2) ;days only
(setq days (read (substring isodurationstring
(match-beginning 3)
(match-end 3))))
(when duration-correction
(setq days (1- days))))
((match-beginning 4) ;days and time
(if (match-beginning 5)
(setq days (read (substring isodurationstring
(match-beginning 6)
(match-end 6)))))
(if (match-beginning 7)
(setq hours (read (substring isodurationstring
(match-beginning 8)
(match-end 8)))))
(if (match-beginning 9)
(setq minutes (read (substring isodurationstring
(match-beginning 10)
(match-end 10)))))
;; FIXME: Support subseconds.
(if (match-beginning 11)
(setq seconds (read (substring isodurationstring
(match-beginning 12)
(match-end 12))))))
((match-beginning 13) ;weeks only
(setq days (* 7 (read (substring isodurationstring
(match-beginning 14)
(match-end 14)))))))
(list seconds minutes hours days months years)))
;; isodatetimestring == nil
nil))