diff options
| author | Ćukasz Stelmach | 2024-02-07 14:37:39 +0100 |
|---|---|---|
| committer | Stefan Kangas | 2025-03-01 04:38:06 +0100 |
| commit | bc33b70b280933470b252f2a877fd50e4aed42ba (patch) | |
| tree | 1bff2633ecb58a10aadc0f28a37868e4d9093f3a | |
| parent | c0ca272bd7cbab5a2013e112f171e1d7fda65216 (diff) | |
| download | emacs-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.el | 2 | ||||
| -rw-r--r-- | test/lisp/calendar/time-date-tests.el | 12 |
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 | ||