diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-05-12 12:35:41 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-05-12 13:12:48 +0200 |
| commit | d0ed9dd836b270d6bf75b302535de0f0f8f376e5 (patch) | |
| tree | edd68c3b5fd610f3252493614df9d0b5eee47b98 | |
| parent | c871f79f49087582c6ea7a42e79fd5fd3968bf00 (diff) | |
Add a proper implementation of add_months() and a test for the
case when it fails by giving erroneous dates like 30th February.
| -rw-r--r-- | src/local_time.cc | 15 | ||||
| -rw-r--r-- | test/util_test.cc | 38 |
2 files changed, 30 insertions, 23 deletions
diff --git a/src/local_time.cc b/src/local_time.cc index 3a4b0cd9..1c174e50 100644 --- a/src/local_time.cc +++ b/src/local_time.cc @@ -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 diff --git a/test/util_test.cc b/test/util_test.cc index a537909d..047f7fa1 100644 --- a/test/util_test.cc +++ b/test/util_test.cc @@ -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"); + } } |
