emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] scratch/iso8601 c632332: Use decoded time math to be able


From: Lars Ingebrigtsen
Subject: [Emacs-diffs] scratch/iso8601 c632332: Use decoded time math to be able to parse intervals
Date: Mon, 8 Jul 2019 11:22:08 -0400 (EDT)

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

    Use decoded time math to be able to parse intervals
---
 lisp/calendar/iso8601.el            | 15 +++++++++------
 lisp/calendar/time-date.el          | 10 ++++++++--
 test/lisp/calendar/iso8601-tests.el | 14 +++++---------
 3 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/lisp/calendar/iso8601.el b/lisp/calendar/iso8601.el
index 79e1403..5619067 100644
--- a/lisp/calendar/iso8601.el
+++ b/lisp/calendar/iso8601.el
@@ -261,13 +261,16 @@ Return the number of minutes."
        (t
         (signal 'wrong-type-argument string))))
     (unless end
-      (setq end (decode-time (time-add (encode-time start)
-                                       (encode-time duration))
-                             (decoded-time-zone start))))
+      (setq end (decoded-time-add start duration)))
     (unless start
-      (setq start (decode-time (time-subtract (encode-time end)
-                                              (encode-time duration))
-                               (decoded-time-zone end))))
+      (setq start (decoded-time-add end
+                                    ;; We negate the duration so that
+                                    ;; we get a subtraction.
+                                    (mapcar (lambda (elem)
+                                              (if (numberp elem)
+                                                  (- elem)
+                                                elem))
+                                            duration))))
     (list start end
           (or duration
               (decode-time (time-subtract (encode-time end)
diff --git a/lisp/calendar/time-date.el b/lisp/calendar/time-date.el
index 4fbb3c5..35c89a2 100644
--- a/lisp/calendar/time-date.el
+++ b/lisp/calendar/time-date.el
@@ -386,7 +386,10 @@ decreased to be valid (\"add one month\" to January 31st 
will
 yield a result of February 28th (or 29th, depending on the leap
 year status).
 
-Fields are added in a most to least significant order."
+Fields are added in a most to least significant order.
+
+When changing the time bits in TIME (i.e., second/minute/hour),
+changes in daylight saving time are not taken into account."
   (let ((time (copy-sequence time))
         seconds)
     ;; Years are simple.
@@ -399,7 +402,7 @@ Fields are added in a most to least significant order."
         (setf (decoded-time-month time) (mod new 12))
         (cl-incf (decoded-time-year time) (/ new 12))))
 
-    ;; Adjust for month length.
+    ;; Adjust for month length (as described in the doc string).
     (setf (decoded-time-day time)
           (min (date-days-in-month (decoded-time-year time)
                                    (decoded-time-month time))
@@ -427,6 +430,7 @@ Fields are added in a most to least significant order."
     time))
 
 (defun decoded-time--alter-month (time increase)
+  "Increase or decrease the month in TIME by 1."
   (if increase
       (progn
         (cl-incf (decoded-time-month time))
@@ -439,6 +443,7 @@ Fields are added in a most to least significant order."
       (cl-decf (decoded-time-year time)))))
 
 (defun decoded-time--alter-day (time increase)
+  "Increase or decrease the day in TIME by 1."
   (if increase
       (progn
         (cl-incf (decoded-time-day time))
@@ -455,6 +460,7 @@ Fields are added in a most to least significant order."
                                 (decoded-time-month time))))))
 
 (defun decoded-time--alter-second (time seconds increase)
+  "Increase or decrease the time in TIME by SECONDS."
   (let ((old (+ (* (or (decoded-time-hour time) 0) 3600)
                 (* (or (decoded-time-minute time) 0) 60)
                 (or (decoded-time-second time) 0))))
diff --git a/test/lisp/calendar/iso8601-tests.el 
b/test/lisp/calendar/iso8601-tests.el
index b33f38f..29f599b 100644
--- a/test/lisp/calendar/iso8601-tests.el
+++ b/test/lisp/calendar/iso8601-tests.el
@@ -98,16 +98,12 @@
              (0 30 15 11 5 2008 nil nil 0)
              ;; Hm...  can't really use decode-time for time differences...
              (0 30 2 14 3 1971 0 nil 0))))
-  (should
-   (equal (iso8601-parse-interval "2007-03-01T13:00:00Z/P1Y2M10DT2H30M")
-          '((0 0 13 1 3 2007 nil nil 0)
-            ;; Well, that's wrong...
-            (0 47 14 10 4 38 6 nil 0)
-            (0 30 2 10 2 1 nil nil nil))))
+  (should (equal (iso8601-parse-interval "2007-03-01T13:00:00Z/P1Y2M10DT2H30M")
+                 '((0 0 13 1 3 2007 nil nil 0)
+                   (0 30 15 11 5 2008 nil nil 0)
+                   (0 30 2 10 2 1 nil nil nil))))
   (should (equal (iso8601-parse-interval "P1Y2M10DT2H30M/2008-05-11T15:30:00Z")
-                 ;; I think I have to add decoded-time math functions,
-                 ;; really.
-                 '((0 43 13 1 4 3977 5 nil 0)
+                 '((0 0 13 1 3 2007 nil nil 0)
                    (0 30 15 11 5 2008 nil nil 0)
                    (0 30 2 10 2 1 nil nil nil)))))
 



reply via email to

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