diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -47,6 +47,17 @@ class XMLRPCTestCase(unittest.TestCase):
(newdt,), m = xmlrpclib.loads(s, use_datetime=0)
self.assertEquals(newdt, xmlrpclib.DateTime('20050210T11:41:23'))
+ def test_datetime_before_1900(self):
+ # same as before but with an date before 1900
+ dt = datetime.datetime(1, 02, 10, 11, 41, 23)
+ s = xmlrpclib.dumps((dt,))
+ (newdt,), m = xmlrpclib.loads(s, use_datetime=1)
+ self.assertEquals(newdt, dt)
+ self.assertEquals(m, None)
+
+ (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
+ self.assertEquals(newdt, xmlrpclib.DateTime('00010210T11:41:23'))
+
def test_dump_bare_date(self):
# This checks that an unwrapped datetime.date object can be handled
# by the marshalling code. This can't be done via test_dump_load()
@@ -60,6 +71,18 @@ class XMLRPCTestCase(unittest.TestCase):
(newdt,), m = xmlrpclib.loads(s, use_datetime=0)
self.assertEquals(newdt, xmlrpclib.DateTime('20050210T00:00:00'))
+
+ def test_date_before_1900(self):
+ # same as before but with an date before 1900
+ d = datetime.datetime(1, 02, 10, 11, 41, 23).date()
+ s = xmlrpclib.dumps((d,))
+ (newd,), m = xmlrpclib.loads(s, use_datetime=1)
+ self.assertEquals(newd.date(), d)
+ self.assertEquals(newd.time(), datetime.time(0, 0, 0))
+ self.assertEquals(m, None)
+
+ (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
+ self.assertEquals(newdt, xmlrpclib.DateTime('00010210T00:00:00'))
def test_dump_bare_time(self):
# This checks that an unwrapped datetime.time object can be handled
diff --git a/Lib/xmlrpclib.py b/Lib/xmlrpclib.py
--- a/Lib/xmlrpclib.py
+++ b/Lib/xmlrpclib.py
@@ -346,6 +346,26 @@ else:
# @param value The time, given as an ISO 8601 string, a time
# tuple, or a integer time value.
+def _strftime(value):
+ if datetime:
+ if isinstance(value, datetime.datetime):
+ return "%04d%02d%02dT%02d:%02d:%02d" % (value.year, value.month, value.day,
+ value.hour, value.minute, value.second)
+ if isinstance(value, datetime.date):
+ return "%04d%02d%02dT00:00:00" % (value.year, value.month, value.day)
+
+ if isinstance(value, datetime.time):
+ now = datetime.datetime.now()
+ return "%04d%02d%02dT%02d:%02d:%02d" % (now.year, now.month, now.day,
+ value.hour, value.minute, value.second)
+
+ if not isinstance(value, (TupleType, time.struct_time)):
+ if value == 0:
+ value = time.time()
+ value = time.localtime(value)
+
+ return "%04d%02d%02dT%02d:%02d:%02d" % value[:6]
+
class DateTime:
"""DateTime wrapper for an ISO 8601 string or time tuple or
localtime integer value to generate 'dateTime.iso8601' XML-RPC
@@ -353,23 +373,10 @@ class DateTime:
"""
def __init__(self, value=0):
- if not isinstance(value, StringType):
- if datetime and isinstance(value, datetime.datetime):
- self.value = value.strftime("%Y%m%dT%H:%M:%S")
- return
- if datetime and isinstance(value, datetime.date):
- self.value = value.strftime("%Y%m%dT%H:%M:%S")
- return
- if datetime and isinstance(value, datetime.time):
- today = datetime.datetime.now().strftime("%Y%m%d")
- self.value = value.strftime(today+"T%H:%M:%S")
- return
- if not isinstance(value, (TupleType, time.struct_time)):
- if value == 0:
- value = time.time()
- value = time.localtime(value)
- value = time.strftime("%Y%m%dT%H:%M:%S", value)
- self.value = value
+ if isinstance(value, StringType):
+ self.value = value
+ else:
+ self.value = _strftime(value)
def __cmp__(self, other):
if isinstance(other, DateTime):
@@ -722,22 +729,11 @@ class Marshaller:
if datetime:
def dump_datetime(self, value, write):
write("")
- write(value.strftime("%Y%m%dT%H:%M:%S"))
+ write(_strftime(value))
write("\n")
dispatch[datetime.datetime] = dump_datetime
-
- def dump_date(self, value, write):
- write("")
- write(value.strftime("%Y%m%dT00:00:00"))
- write("\n")
- dispatch[datetime.date] = dump_date
-
- def dump_time(self, value, write):
- write("")
- write(datetime.datetime.now().date().strftime("%Y%m%dT"))
- write(value.strftime("%H:%M:%S"))
- write("\n")
- dispatch[datetime.time] = dump_time
+ dispatch[datetime.date] = dump_datetime
+ dispatch[datetime.time] = dump_datetime
def dump_instance(self, value, write):
# check for special wrappers