aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaszlo Kiss-Kollar <kiss.kollar.laszlo@gmail.com>2017-12-06 17:44:46 +0000
committerLaszlo Kiss-Kollar <kiss.kollar.laszlo@gmail.com>2017-12-06 17:46:28 +0000
commit7913760140e41abf91274171a53d757d8befb404 (patch)
treed64727ee06f5650743256b2b69005fbc89bd31e3
parentf00c96c2d7bfb86e6f1802baadd1b93a41931089 (diff)
downloaddateutil-7913760140e41abf91274171a53d757d8befb404.tar.gz
Fix float handling for years and months in relativedelta
-rw-r--r--dateutil/relativedelta.py16
-rw-r--r--dateutil/test/test_relativedelta.py24
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,