Add fromdelta
This commit is contained in:
parent
43ba4e2a5e
commit
2a1d235a32
11
MANIFEST.in
11
MANIFEST.in
|
@ -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]
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue