]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix off-by-one error in decoded-time-add (with months)
authorLars Ingebrigtsen <larsi@gnus.org>
Thu, 20 Aug 2020 22:38:23 +0000 (00:38 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 20 Aug 2020 22:38:23 +0000 (00:38 +0200)
* lisp/calendar/time-date.el (decoded-time-add): Fix month
addition, which was off-by-one.

lisp/calendar/time-date.el
test/lisp/calendar/time-date-tests.el

index 125f9acc70563c0f0e30d406dcc65745509f427a..638d8c1f88436ef5071ea2e022b2be708cd16951 100644 (file)
@@ -401,10 +401,10 @@ changes in daylight saving time are not taken into account."
     (when (decoded-time-year delta)
       (cl-incf (decoded-time-year time) (decoded-time-year delta)))
 
-    ;; Months are pretty simple.
+    ;; Months are pretty simple, but start at 1 (for January).
     (when (decoded-time-month delta)
-      (let ((new (+ (decoded-time-month time) (decoded-time-month delta))))
-        (setf (decoded-time-month time) (mod new 12))
+      (let ((new (+ (1- (decoded-time-month time)) (decoded-time-month delta))))
+        (setf (decoded-time-month time) (1+ (mod new 12)))
         (cl-incf (decoded-time-year time) (/ new 12))))
 
     ;; Adjust for month length (as described in the doc string).
index fe1460cf29ebbec3b006efe3a46f4f036172f0e8..233d43cd01afa09acf878cfcfccebbb12f4155b9 100644 (file)
   (should (equal (decoded-time-period '((135 . 10) 0 0 0 0 0 nil nil nil))
                  13.5)))
 
+(ert-deftest test-time-wrap-addition ()
+  (should (equal (decoded-time-add '(0 0 0 1 11 2008 nil nil nil)
+                                   (make-decoded-time :month 1))
+                 '(0 0 0 1 12 2008 nil nil nil)))
+  (should (equal (decoded-time-add '(0 0 0 1 12 2008 nil nil nil)
+                                   (make-decoded-time :month 1))
+                 '(0 0 0 1 1 2009 nil nil nil)))
+  (should (equal (decoded-time-add '(0 0 0 1 11 2008 nil nil nil)
+                                   (make-decoded-time :month 12))
+                 '(0 0 0 1 11 2009 nil nil nil)))
+  (should (equal (decoded-time-add '(0 0 0 1 11 2008 nil nil nil)
+                                   (make-decoded-time :month 13))
+                 '(0 0 0 1 12 2009 nil nil nil)))
+  (should (equal (decoded-time-add '(0 0 0 30 12 2008 nil nil nil)
+                                   (make-decoded-time :day 1))
+                 '(0 0 0 31 12 2008 nil nil nil)))
+  (should (equal (decoded-time-add '(0 0 0 30 12 2008 nil nil nil)
+                                   (make-decoded-time :day 2))
+                 '(0 0 0 1 1 2009 nil nil nil))))
+
 ;;; time-date-tests.el ends here