summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/calendar/iso8601.el8
-rw-r--r--test/lisp/calendar/iso8601-tests.el80
2 files changed, 84 insertions, 4 deletions
diff --git a/lisp/calendar/iso8601.el b/lisp/calendar/iso8601.el
index 83b57a4f56a..f44ed3858f6 100644
--- a/lisp/calendar/iso8601.el
+++ b/lisp/calendar/iso8601.el
@@ -66,7 +66,7 @@
"\\([0-9][0-9]\\):?\\([0-9][0-9]\\)?:?\\([0-9][0-9]\\)?\\.?\\([0-9][0-9][0-9]\\)?")
(defconst iso8601--zone-match
- "\\(Z\\|\\([-+]\\)?\\([0-9][0-9]\\):?\\([0-9][0-9]\\)?\\)")
+ "\\(Z\\|\\([-+]\\)\\([0-9][0-9]\\):?\\([0-9][0-9]\\)?\\)")
(defconst iso8601--full-time-match
(concat "\\(" (replace-regexp-in-string "(" "(?:" iso8601--time-match) "\\)"
@@ -76,8 +76,8 @@
(concat "\\(" iso8601--date-match "\\)"
"\\(?:T\\("
(replace-regexp-in-string "(" "(?:" iso8601--time-match)
- "\\)\\)?"
- "\\(" iso8601--zone-match "\\)?"))
+ "\\)"
+ "\\(" iso8601--zone-match "\\)?\\)?"))
(defconst iso8601--duration-full-match
"P\\([0-9]+Y\\)?\\([0-9]+M\\)?\\([0-9]+D\\)?\\(T\\([0-9]+H\\)?\\([0-9]+M\\)?\\([0-9]+S\\)?\\)?")
@@ -303,7 +303,7 @@ Return the number of minutes."
(or duration
(decode-time (time-subtract (iso8601--encode-time end)
(iso8601--encode-time start))
- (decoded-time-zone end))))))
+ (or (decoded-time-zone end) 0))))))
(defun iso8601--match (regexp string)
(string-match (concat "\\`" regexp "\\'") string))
diff --git a/test/lisp/calendar/iso8601-tests.el b/test/lisp/calendar/iso8601-tests.el
index 5403c8e2077..7b1dbfdf495 100644
--- a/test/lisp/calendar/iso8601-tests.el
+++ b/test/lisp/calendar/iso8601-tests.el
@@ -208,4 +208,84 @@
(should (equal (iso8601-parse-time "15:27:46-05")
'(46 27 15 nil nil nil nil nil -300))))
+(ert-deftest standard-test-date-and-time-of-day ()
+ (should (equal (iso8601-parse "19850412T101530")
+ '(30 15 10 12 4 1985 nil nil nil)))
+ (should (equal (iso8601-parse "1985-04-12T10:15:30")
+ '(30 15 10 12 4 1985 nil nil nil)))
+
+ (should (equal (iso8601-parse "1985102T235030Z")
+ '(30 50 23 12 4 1985 nil nil 0)))
+ (should (equal (iso8601-parse "1985-102T23:50:30Z")
+ '(30 50 23 12 4 1985 nil nil 0)))
+
+ (should (equal (iso8601-parse "1985W155T235030")
+ '(30 50 23 12 4 1985 nil nil nil)))
+ (should (equal (iso8601-parse "1985-W155T23:50:30")
+ '(30 50 23 12 4 1985 nil nil nil))))
+
+(ert-deftest standard-test-interval ()
+ ;; A time interval starting at 20 minutes and 50 seconds past 23
+ ;; hours on 12 April 1985 and ending at 30 minutes past 10 hours on
+ ;; 25 June 1985.
+ (should (equal (iso8601-parse-interval "19850412T232050/19850625T103000")
+ '((50 20 23 12 4 1985 nil nil nil)
+ (0 30 10 25 6 1985 nil nil nil)
+ (10 9 11 15 3 1970 0 nil 0))))
+ (should (equal (iso8601-parse-interval
+ "1985-04-12T23:20:50/1985-06-25T10:30:00")
+ '((50 20 23 12 4 1985 nil nil nil)
+ (0 30 10 25 6 1985 nil nil nil)
+ (10 9 11 15 3 1970 0 nil 0))))
+
+ ;; A time interval starting at 12 April 1985 and ending on 25 June
+ ;; 1985.
+
+ ;; This example doesn't seem valid according to the standard.
+ ;; "0625" is unambiguous, and means "the year 625". Weird.
+ ;; (should (equal (iso8601-parse-interval "19850412/0625")
+ ;; '((nil nil nil 12 4 1985 nil nil nil)
+ ;; (nil nil nil nil nil 625 nil nil nil)
+ ;; (0 17 0 22 9 609 5 nil 0))))
+
+ ;; A time interval of 2 years, 10 months, 15 days, 10 hours, 20
+ ;; minutes and 30 seconds.
+ (should (equal (iso8601-parse-duration "P2Y10M15DT10H20M30S")
+ '(30 20 10 15 10 2 nil nil nil)))
+
+ (should (equal (iso8601-parse-duration "P00021015T102030")
+ '(30 20 10 15 10 2 nil nil nil)))
+ (should (equal (iso8601-parse-duration "P0002-10-15T10:20:30")
+ '(30 20 10 15 10 2 nil nil nil)))
+
+ ;; A time interval of 1 year and 6 months.
+ (should (equal (iso8601-parse-duration "P1Y6M")
+ '(0 0 0 0 6 1 nil nil nil)))
+ (should (equal (iso8601-parse-duration "P0001-06")
+ '(nil nil nil nil 6 1 nil nil nil)))
+
+ ;; A time interval of seventy-two hours.
+ (should (equal (iso8601-parse-duration "PT72H")
+ '(0 0 72 0 0 0 nil nil nil)))
+
+ ;; Defined by start and duration
+ ;; A time interval of 1 year, 2 months, 15 days and 12 hours,
+ ;; beginning on 12 April 1985 at 20 minutes past 23 hours.
+ (should (equal (iso8601-parse-interval "19850412T232000/P1Y2M15DT12H")
+ '((0 20 23 12 4 1985 nil nil nil)
+ (0 20 11 28 6 1986 nil nil nil)
+ (0 0 12 15 2 1 nil nil nil))))
+ (should (equal (iso8601-parse-interval "1985-04-12T23:20:00/P1Y2M15DT12H")
+ '((0 20 23 12 4 1985 nil nil nil)
+ (0 20 11 28 6 1986 nil nil nil)
+ (0 0 12 15 2 1 nil nil nil))))
+
+ ;; Defined by duration and end
+ ;; A time interval of 1 year, 2 months, 15 days and 12 hours, ending
+ ;; on 12 April 1985 at 20 minutes past 23 hour.
+ (should (equal (iso8601-parse-interval "P1Y2M15DT12H/19850412T232000")
+ '((0 20 11 28 1 1984 nil nil nil)
+ (0 20 23 12 4 1985 nil nil nil)
+ (0 0 12 15 2 1 nil nil nil)))))
+
;;; iso8601-tests.el ends here