diff --git a/src/zeep/xsd/types/builtins.py b/src/zeep/xsd/types/builtins.py index 56f28da6..2e720cd7 100644 --- a/src/zeep/xsd/types/builtins.py +++ b/src/zeep/xsd/types/builtins.py @@ -149,6 +149,12 @@ def xmlvalue(self, value): if isinstance(value, str): return value + if not isinstance(value, datetime.datetime): + # The value passed in could be either a datetime or a date + # if it's a date merge in datetime.time.min - `datetime.time(0, 0)` + # to make it a datetime + value = datetime.datetime.combine(value, datetime.time.min) + return value.isoformat().replace("+00:00", "Z") @treat_whitespace("collapse") @@ -188,6 +194,7 @@ class Date(BuiltinType): def xmlvalue(self, value): if isinstance(value, str): return value + return value.strftime("%Y-%m-%d") @treat_whitespace("collapse") diff --git a/tests/test_xsd_builtins.py b/tests/test_xsd_builtins.py index 4f055da9..4d209c10 100644 --- a/tests/test_xsd_builtins.py +++ b/tests/test_xsd_builtins.py @@ -156,6 +156,10 @@ def test_pythonvalue(self): class TestDateTime: def test_xmlvalue(self): + instance = builtins.DateTime() + value = datetime.date(2016, 3, 4) + assert instance.xmlvalue(value) == "2016-03-04T00:00:00" + instance = builtins.DateTime() value = datetime.datetime(2016, 3, 4, 21, 14, 42) assert instance.xmlvalue(value) == "2016-03-04T21:14:42"