aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorƁukasz Stelmach2024-02-07 14:37:39 +0100
committerStefan Kangas2025-03-01 04:38:06 +0100
commitbc33b70b280933470b252f2a877fd50e4aed42ba (patch)
tree1bff2633ecb58a10aadc0f28a37868e4d9093f3a
parentc0ca272bd7cbab5a2013e112f171e1d7fda65216 (diff)
downloademacs-bc33b70b280933470b252f2a877fd50e4aed42ba.tar.gz
emacs-bc33b70b280933470b252f2a877fd50e4aed42ba.zip
Fix handling of delta values with negative month field
* lisp/calendar/time-date.el (decoded-time-add): If the new variable is less then zero, the year needs to be decremented by quotient of new and 12 increased by one. * test/lisp/calendar/time-date-tests.el (test-decoded-add): Add applicable test cases. (Bug#68969)
-rw-r--r--lisp/calendar/time-date.el2
-rw-r--r--test/lisp/calendar/time-date-tests.el12
2 files changed, 13 insertions, 1 deletions
diff --git a/lisp/calendar/time-date.el b/lisp/calendar/time-date.el
index ce8c668c8cd..01f96305edb 100644
--- a/lisp/calendar/time-date.el
+++ b/lisp/calendar/time-date.el
@@ -547,7 +547,7 @@ changes in daylight saving time are not taken into account."
547 (when (decoded-time-month delta) 547 (when (decoded-time-month delta)
548 (let ((new (+ (1- (decoded-time-month time)) (decoded-time-month delta)))) 548 (let ((new (+ (1- (decoded-time-month time)) (decoded-time-month delta))))
549 (setf (decoded-time-month time) (1+ (mod new 12))) 549 (setf (decoded-time-month time) (1+ (mod new 12)))
550 (incf (decoded-time-year time) (/ new 12)))) 550 (incf (decoded-time-year time) (- (/ new 12) (if (< new 0) 1 0)))))
551 551
552 ;; Adjust for month length (as described in the doc string). 552 ;; Adjust for month length (as described in the doc string).
553 (setf (decoded-time-day time) 553 (setf (decoded-time-day time)
diff --git a/test/lisp/calendar/time-date-tests.el b/test/lisp/calendar/time-date-tests.el
index b8d3381528e..7df1e1b0da7 100644
--- a/test/lisp/calendar/time-date-tests.el
+++ b/test/lisp/calendar/time-date-tests.el
@@ -161,6 +161,18 @@
161 (should (equal (decoded-time-add time (mdec :month 10)) 161 (should (equal (decoded-time-add time (mdec :month 10))
162 '(12 15 16 8 5 2020 1 t 7200))) 162 '(12 15 16 8 5 2020 1 t 7200)))
163 163
164 (should (equal (decoded-time-add time (mdec :month -1))
165 '(12 15 16 8 6 2019 1 t 7200)))
166
167 (should (equal (decoded-time-add time (mdec :month -10))
168 '(12 15 16 8 9 2018 1 t 7200)))
169
170 (should (equal (decoded-time-add time (mdec :month -14))
171 '(12 15 16 8 5 2018 1 t 7200)))
172
173 (should (equal (decoded-time-add time (mdec :month -24))
174 '(12 15 16 8 7 2017 1 t 7200)))
175
164 (should (equal (decoded-time-add time (mdec :day 1)) 176 (should (equal (decoded-time-add time (mdec :day 1))
165 '(12 15 16 9 7 2019 1 t 7200))) 177 '(12 15 16 9 7 2019 1 t 7200)))
166 178