changeset 31291:bd5e3cc2284f

maint: Merge stable to default
author Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
date Wed, 12 Oct 2022 10:41:05 -0400
parents 90fc667a459d (current diff) b8afc6e7d9b4 (diff)
children 7713b2b5084b
files etc/NEWS.7.md
diffstat 2 files changed, 19 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/etc/NEWS.7.md	Tue Oct 11 18:29:39 2022 -0700
+++ b/etc/NEWS.7.md	Wed Oct 12 10:41:05 2022 -0400
@@ -21,6 +21,7 @@
 - `pie3`: Fix "Too many input" args error.
 - Accept negative inputs to -2^63 for `dec2bin` and `dec2hex` (bug #63089).
 - Fix incorrect `lambda` outputs for `lsqnonneg` and `pqpnonneg` (bug #63178).
+- `addtodate.m`: Fix wrong month returned when subtracting a month from some end-of-month dates (bug #60671).
 
 ### GUI
 
--- a/scripts/time/addtodate.m	Tue Oct 11 18:29:39 2022 -0700
+++ b/scripts/time/addtodate.m	Wed Oct 12 10:41:05 2022 -0400
@@ -64,6 +64,9 @@
       ## adjust the years and months if the date rolls over a year
       dtmp(:,1) += floor ((dtmp(:,2)-1)/12);
       dtmp(:,2) = mod (dtmp(:,2)-1, 12) + 1;
+      ## avoid days beyond end of month
+      beyondEOM = dtmp(:,3) > eomday (dtmp(:,1), dtmp(:,2));
+      dtmp(beyondEOM,3) = eomday (dtmp(beyondEOM,1), dtmp(beyondEOM,2));
     endif
     dnew = datenum (dtmp);
     ## make the output the right shape
@@ -120,6 +123,21 @@
 %!assert (addtodate ([d;d+1], 1, "month"), [d+31;d+1+31])
 %!assert (addtodate ([d d+1], 1, "month"), [d+31 d+1+31])
 
+## end of month days check
+%!test <60671>
+%! assert (addtodate (datenum ("2020-12-31"), -1, "month"), 738125)
+%! assert (addtodate (datenum ("2020-12-30"), -1, "month"), 738125)
+%! assert (addtodate (datenum ("2020-12-29"), -1, "month"), 738124)
+%! assert (addtodate (datenum ("2021-03-31"), -1, "month"), 738215)
+%! assert (addtodate (datenum ("2021-03-29"), -1, "month"), 738215)
+%! assert (addtodate (datenum ("2020-03-30"), -1, "month"), 737850)
+%! assert (addtodate (datenum ("2020-03-29"), -1, "month"), 737850)
+%! assert (addtodate (datenum ("2020-03-28"), -1, "month"), 737849)
+%! assert (addtodate (datenum ("2020-02-29"), -1, "month"), 737819)
+%! assert (addtodate (datenum ("2020-02-28"), -1, "month"), 737818)
+%! assert (addtodate (datenum ("2020-01-31"), +1, "month"), 737850)
+ 
+
 ## Test input validation
 %!error <Invalid call> addtodate ()
 %!error <Invalid call> addtodate (1)