Add a proper implementation of add_months() and a test for the
authorCarl Hetherington <cth@carlh.net>
Tue, 12 May 2020 10:35:41 +0000 (12:35 +0200)
committerCarl Hetherington <cth@carlh.net>
Tue, 12 May 2020 11:12:48 +0000 (13:12 +0200)
case when it fails by giving erroneous dates like 30th February.

src/local_time.cc
test/util_test.cc

index 3a4b0cd98c31c8d3191a5ca4107703e0d1afc723..1c174e502462a7d216b48a6e41bc8ad4dbc6045a 100644 (file)
@@ -220,17 +220,16 @@ LocalTime::time_of_day (bool with_second, bool with_millisecond) const
 void
 LocalTime::add_months (int m)
 {
-       _month += m;
+       using namespace boost;
 
-       while (_month < 0) {
-               _month += 12;
-               _year--;
+       gregorian::date d (_year, _month, _day);
+       if (m > 0) {
+               d += gregorian::months (m);
+       } else {
+               d -= gregorian::months (-m);
        }
 
-       while (_month > 11) {
-               _month -= 12;
-               _year++;
-       }
+       set (posix_time::ptime(d, posix_time::time_duration(_hour, _minute, _second, _millisecond * 1000)));
 }
 
 void
index a537909d40e3de37d3b94c47025eebc67fe313f3..047f7fa19ca0c9b03d0ee78d7b13042cd028933f 100644 (file)
@@ -277,19 +277,27 @@ BOOST_AUTO_TEST_CASE (unique_string_test)
 
 BOOST_AUTO_TEST_CASE (local_time_add_months_test)
 {
-       dcp::LocalTime t("2013-06-23T18:06:59.123");
-       t.add_months(-1);
-       BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-05-23T18:06:59.123"));
-       t.add_months(1);
-       BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-06-23T18:06:59.123"));
-       t.add_months(1);
-       BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-07-23T18:06:59.123"));
-       t.add_months(4);
-       BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-11-23T18:06:59.123"));
-       t.add_months(2);
-       BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
-       t.add_months(-14);
-       BOOST_CHECK_EQUAL (t, dcp::LocalTime("2012-11-23T18:06:59.123"));
-       t.add_months(14);
-       BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
+       {
+               dcp::LocalTime t("2013-06-23T18:06:59.123");
+               t.add_months(-1);
+               BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-05-23T18:06:59.123"));
+               t.add_months(1);
+               BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-06-23T18:06:59.123"));
+               t.add_months(1);
+               BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-07-23T18:06:59.123"));
+               t.add_months(4);
+               BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-11-23T18:06:59.123"));
+               t.add_months(2);
+               BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
+               t.add_months(-14);
+               BOOST_CHECK_EQUAL (t, dcp::LocalTime("2012-11-23T18:06:59.123"));
+               t.add_months(14);
+               BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
+       }
+
+       {
+               dcp::LocalTime t("2018-01-30T11:00:00+01:00");
+               t.add_months (1);
+               BOOST_CHECK_EQUAL (t.as_string(), "2018-02-28T11:00:00+01:00");
+       }
 }