Add fromdelta

This commit is contained in:
Davide Brunato 2019-01-14 07:35:03 +01:00
parent 43ba4e2a5e
commit 2a1d235a32
3 changed files with 76 additions and 2 deletions

View File

@ -1,2 +1,11 @@
# Include the license file
include LICENSE
include MANIFEST.in
include README.rst
include CHANGELOG.rst
include setup.py
include setup.cfg
include requirements-dev.txt
include tox.ini
include doc/*
global-exclude *.py[cod]

View File

@ -276,6 +276,11 @@ class AbstractDateTime(object):
kwargs['year'] += y10k if y10k > 0 else -y10k
if bce:
kwargs['year'] = - kwargs['year']
if 'hour' not in kwargs and dt.hour:
tzinfo = kwargs.get('tzinfo')
if tzinfo is None:
kwargs['tzinfo'] = Timezone(datetime.timedelta(hours=dt.hour))
return cls(**kwargs)
@classmethod
@ -335,6 +340,42 @@ class OrderedDateTime(AbstractDateTime):
def __str__(self):
pass
@classmethod
def fromdelta(cls, delta):
"""
Creates an XSD dateTime/date instance from a datetime.timedelta related to
0001-01-01T00:00:00 CE. In case of a date the time part is not counted.
"""
if delta.total_seconds() >= 0:
try:
dt = datetime.datetime(1, 1, 1) + delta
except OverflowError:
days_in_400y = 146097 # = 400 * 365 + 100 + 1 - 4
pass
else:
return cls.fromdatetime(dt)
else:
days = -delta.days - 1
days -= days // 1461 - days // 36524 + days // 146097
year = days // 365
days = -delta.days - year * 365 - leapdays(-year + 1, 1)
if 306 < days < 366 and isleap(year):
days -= 1
td = datetime.timedelta(days=-days, seconds=delta.seconds, microseconds=delta.microseconds)
print(year, td)
import pdb
pdb.set_trace()
if year == 0:
year += 2 if td else 1
elif year == 1 and td:
year += 1
dt = datetime.datetime(year, 1, 1) + td
return cls.fromdatetime(dt, bce=True)
@property
def common_era_delta(self):
"""Property that returns the datetime.timedelta from 0001-01-01T00:00:00 CE."""
@ -382,6 +423,7 @@ class OrderedDateTime(AbstractDateTime):
bce = not self.bce
year = abs(year) + 1
dt = self.dt.replace(year=year, month=month, day=adjust_day(year, month, self.dt.day))
else:
raise ElementPathTypeError("wrong type %r for operand %r." % (type(other), other))

View File

@ -278,7 +278,7 @@ class DateTimeTypesTest(unittest.TestCase):
self.assertRaises(TypeError, operator.le, mkdt("2002-04-02T18:00:00+02:00"), mkdate("2002-04-03"))
def test_months2days_function(self):
# self.assertEqual(months2days(-119, 1, 12 * 319), 116512)
self.assertEqual(months2days(-119, 1, 12 * 319), 116512)
self.assertEqual(months2days(200, 1, -12 * 320) - 1, -116877 - 2)
# 0000 BCE tests
@ -309,6 +309,29 @@ class DateTimeTypesTest(unittest.TestCase):
self.assertEqual(Date10.fromstring("-0001-12-31-02:00").common_era_delta, datetime.timedelta(hours=-22))
self.assertEqual(Date10.fromstring("-0001-12-31+03:00").common_era_delta, datetime.timedelta(hours=-27))
def test_fromdelta(self):
self.assertEqual(Date.fromdelta(datetime.timedelta(days=0)), Date.fromstring("0001-01-01"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=31)), Date.fromstring("0001-02-01"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=59)), Date.fromstring("0001-03-01"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=151)), Date.fromstring("0001-06-01"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=153)), Date.fromstring("0001-06-03"))
self.assertEqual(DateTime.fromdelta(datetime.timedelta(days=153, seconds=72000)),
DateTime.fromstring("0001-06-03T20:00:00"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=365)), Date.fromstring("0002-01-01"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=396)), Date.fromstring("0002-02-01"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=-366)), Date.fromstring("-0000-01-01"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=-1)), Date.fromstring("-0000-12-31"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=-335)), Date.fromstring("-0000-02-01"))
self.assertEqual(Date.fromdelta(datetime.timedelta(days=-1)), Date.fromstring("-0000-12-31"))
self.assertEqual(Date10.fromdelta(datetime.timedelta(days=-366)), Date10.fromstring("-0001-01-01"))
self.assertEqual(Date10.fromdelta(datetime.timedelta(days=-326)), Date10.fromstring("-0001-02-10"))
self.assertEqual(Date10.fromdelta(datetime.timedelta(days=-1)), Date10.fromstring("-0001-12-31Z"))
self.assertEqual(Date10.fromdelta(datetime.timedelta(hours=-22)), Date10.fromstring("-0001-12-31-02:00"))
self.assertEqual(Date10.fromdelta(datetime.timedelta(hours=-27)), Date10.fromstring("-0001-12-31+03:00"))
def test_sub_operator(self):
date = Date.fromstring
date10 = Date10.fromstring