emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] scratch/iso8601 57ca5db 2/2: Add support for times with ti


From: Lars Ingebrigtsen
Subject: [Emacs-diffs] scratch/iso8601 57ca5db 2/2: Add support for times with time zones
Date: Mon, 29 Jul 2019 06:08:02 -0400 (EDT)

branch: scratch/iso8601
commit 57ca5db4c2dfceef28f0cb9f1398f4752ffaae51
Author: Lars Ingebrigtsen <address@hidden>
Commit: Lars Ingebrigtsen <address@hidden>

    Add support for times with time zones
---
 lisp/calendar/iso8601.el            | 44 +++++++++++++++++-----------
 test/lisp/calendar/iso8601-tests.el | 57 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 83 insertions(+), 18 deletions(-)

diff --git a/lisp/calendar/iso8601.el b/lisp/calendar/iso8601.el
index 5952586..83b57a4 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.
diff --git a/test/lisp/calendar/iso8601-tests.el 
b/test/lisp/calendar/iso8601-tests.el
index 8517e7d..5403c8e 100644
--- a/test/lisp/calendar/iso8601-tests.el
+++ b/test/lisp/calendar/iso8601-tests.el
@@ -139,7 +139,7 @@
   (should (equal (iso8601-parse-date "+19850412")
                  '(nil nil nil 12 4 1985 nil nil nil))))
 
-(ert-deftest standard-test-time-of-day ()
+(ert-deftest standard-test-time-of-day-local-time ()
   (should (equal (iso8601-parse-time "152746")
                  '(46 27 15 nil nil nil nil nil nil)))
   (should (equal (iso8601-parse-time "15:27:46")
@@ -153,4 +153,59 @@
   (should (equal (iso8601-parse-time "15")
                  '(0 0 15 nil nil nil nil nil nil))))
 
+(ert-deftest standard-test-time-of-day-fractions ()
+  ;; decoded-time doesn't support sub-second times.
+  ;; (should (equal (iso8601-parse-time "152735,5")
+  ;;                '(46 27 15 nil nil nil nil nil nil)))
+  ;; (should (equal (iso8601-parse-time "15:27:35,5")
+  ;;                '(46 27 15 nil nil nil nil nil nil)))
+  )
+
+(ert-deftest standard-test-time-of-day-beginning-of-day ()
+  (should (equal (iso8601-parse-time "000000")
+                 '(0 0 0 nil nil nil nil nil nil)))
+  (should (equal (iso8601-parse-time "00:00:00")
+                 '(0 0 0 nil nil nil nil nil nil)))
+
+  (should (equal (iso8601-parse-time "0000")
+                 '(0 0 0 nil nil nil nil nil nil)))
+  (should (equal (iso8601-parse-time "00:00")
+                 '(0 0 0 nil nil nil nil nil nil))))
+
+(ert-deftest standard-test-time-of-day-utc ()
+  (should (equal (iso8601-parse-time "232030Z")
+                 '(30 20 23 nil nil nil nil nil 0)))
+  (should (equal (iso8601-parse-time "23:20:30Z")
+                 '(30 20 23 nil nil nil nil nil 0)))
+
+  (should (equal (iso8601-parse-time "2320Z")
+                 '(0 20 23 nil nil nil nil nil 0)))
+  (should (equal (iso8601-parse-time "23:20Z")
+                 '(0 20 23 nil nil nil nil nil 0)))
+
+  (should (equal (iso8601-parse-time "23Z")
+                 '(0 0 23 nil nil nil nil nil 0))))
+
+
+(ert-deftest standard-test-time-of-day-zone ()
+  (should (equal (iso8601-parse-time "152746+0100")
+                 '(46 27 15 nil nil nil nil nil 60)))
+  (should (equal (iso8601-parse-time "15:27:46+0100")
+                 '(46 27 15 nil nil nil nil nil 60)))
+
+  (should (equal (iso8601-parse-time "152746+01")
+                 '(46 27 15 nil nil nil nil nil 60)))
+  (should (equal (iso8601-parse-time "15:27:46+01")
+                 '(46 27 15 nil nil nil nil nil 60)))
+
+  (should (equal (iso8601-parse-time "152746-0500")
+                 '(46 27 15 nil nil nil nil nil -300)))
+  (should (equal (iso8601-parse-time "15:27:46-0500")
+                 '(46 27 15 nil nil nil nil nil -300)))
+
+  (should (equal (iso8601-parse-time "152746-05")
+                 '(46 27 15 nil nil nil nil nil -300)))
+  (should (equal (iso8601-parse-time "15:27:46-05")
+                 '(46 27 15 nil nil nil nil nil -300))))
+
 ;;; iso8601-tests.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]