summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSkip Montanaro <skip@pobox.com>2008-04-18 20:35:46 (GMT)
committerSkip Montanaro <skip@pobox.com>2008-04-18 20:35:46 (GMT)
commitb131f0468f9ecdddcbf1a932cdffc275c81d676a (patch)
tree0d76c81f1be2fc4686e0c8534192dddc7f47b7a2 /Lib
parent08923177b43dd31983447dfe7f25a736e946ed68 (diff)
downloadcpython-b131f0468f9ecdddcbf1a932cdffc275c81d676a.zip
cpython-b131f0468f9ecdddcbf1a932cdffc275c81d676a.tar.gz
cpython-b131f0468f9ecdddcbf1a932cdffc275c81d676a.tar.bz2
resolve issue 2014
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_xmlrpc.py11
-rw-r--r--Lib/xmlrpclib.py30
2 files changed, 30 insertions, 11 deletions
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index a46b9fa..8c048d0 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -55,6 +55,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_cmp_datetime_DateTime(self):
now = datetime.datetime.now()
dt = xmlrpclib.DateTime(now.timetuple())
diff --git a/Lib/xmlrpclib.py b/Lib/xmlrpclib.py
index d99f5d7..d635a4e 100644
--- a/Lib/xmlrpclib.py
+++ b/Lib/xmlrpclib.py
@@ -346,6 +346,20 @@ 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 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,16 +367,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 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 make_comparable(self, other):
if isinstance(other, DateTime):
@@ -772,7 +780,7 @@ class Marshaller:
if datetime:
def dump_datetime(self, value, write):
write("<value><dateTime.iso8601>")
- write(value.strftime("%Y%m%dT%H:%M:%S"))
+ write(_strftime(value))
write("</dateTime.iso8601></value>\n")
dispatch[datetime.datetime] = dump_datetime