diff options
author | Laszlo Kiss-Kollar <kiss.kollar.laszlo@gmail.com> | 2017-12-06 17:44:46 +0000 |
---|---|---|
committer | Laszlo Kiss-Kollar <kiss.kollar.laszlo@gmail.com> | 2017-12-06 17:46:28 +0000 |
commit | 7913760140e41abf91274171a53d757d8befb404 (patch) | |
tree | d64727ee06f5650743256b2b69005fbc89bd31e3 | |
parent | f00c96c2d7bfb86e6f1802baadd1b93a41931089 (diff) | |
download | dateutil-7913760140e41abf91274171a53d757d8befb404.tar.gz |
Fix float handling for years and months in relativedelta
-rw-r--r-- | dateutil/relativedelta.py | 16 | ||||
-rw-r--r-- | dateutil/test/test_relativedelta.py | 24 |
2 files changed, 32 insertions, 8 deletions
diff --git a/dateutil/relativedelta.py b/dateutil/relativedelta.py index 067b5a5..2c3e25c 100644 --- a/dateutil/relativedelta.py +++ b/dateutil/relativedelta.py @@ -34,7 +34,7 @@ class relativedelta(object): year, month, day, hour, minute, second, microsecond: Absolute information (argument is singular); adding or subtracting a - relativedelta with absolute information does not perform an aritmetic + relativedelta with absolute information does not perform an arithmetic operation, but rather REPLACES the corresponding value in the original datetime with the value(s) in relativedelta. @@ -95,11 +95,6 @@ class relativedelta(object): yearday=None, nlyearday=None, hour=None, minute=None, second=None, microsecond=None): - # Check for non-integer values in integer-only quantities - if any(x is not None and x != int(x) for x in (years, months)): - raise ValueError("Non-integer years and months are " - "ambiguous and not currently supported.") - if dt1 and dt2: # datetime is a subclass of date. So both must be date if not (isinstance(dt1, datetime.date) and @@ -159,9 +154,14 @@ class relativedelta(object): self.seconds = delta.seconds + delta.days * 86400 self.microseconds = delta.microseconds else: + # Check for non-integer values in integer-only quantities + if any(x is not None and x != int(x) for x in (years, months)): + raise ValueError("Non-integer years and months are " + "ambiguous and not currently supported.") + # Relative information - self.years = years - self.months = months + self.years = int(years) + self.months = int(months) self.days = days + weeks * 7 self.leapdays = leapdays self.hours = hours diff --git a/dateutil/test/test_relativedelta.py b/dateutil/test/test_relativedelta.py index 9891357..5f0597a 100644 --- a/dateutil/test/test_relativedelta.py +++ b/dateutil/test/test_relativedelta.py @@ -203,6 +203,30 @@ class RelativeDeltaTest(WarningTestMixin, unittest.TestCase): # For unsupported types that define their own comparators, etc. self.assertIs(relativedelta(days=1) + NotAValue, NotAValue) + def testAdditionFloatValue(self): + self.assertEqual(datetime(2000, 1, 1) + relativedelta(days=float(1)), + datetime(2000, 1, 2)) + self.assertEqual(datetime(2000, 1, 1) + relativedelta(months=float(1)), + datetime(2000, 2, 1)) + self.assertEqual(datetime(2000, 1, 1) + relativedelta(years=float(1)), + datetime(2001, 1, 1)) + + self.assertEqual(datetime(2000, 1, 1, 0) + + relativedelta(days=float(0.5)), + datetime(2000, 1, 1, 12)) + self.assertEqual(datetime(2000, 1, 1, 0, 0) + + relativedelta(hours=float(0.5)), + datetime(2000, 1, 1, 0, 30)) + self.assertEqual(datetime(2000, 1, 1, 0, 0, 0) + + relativedelta(minutes=float(0.5)), + datetime(2000, 1, 1, 0, 0, 30)) + self.assertEqual(datetime(2000, 1, 1, 0, 0, 0, 0) + + relativedelta(seconds=float(0.5)), + datetime(2000, 1, 1, 0, 0, 0, 500000)) + self.assertEqual(datetime(2000, 1, 1, 0, 0, 0, 0) + + relativedelta(microseconds=float(500000.5)), + datetime(2000, 1, 1, 0, 0, 0, 500001)) + def testSubtraction(self): self.assertEqual(relativedelta(days=10) - relativedelta(years=1, months=2, days=3, hours=4, |