This commit is contained in:
Calum Calder 2016-06-13 21:16:32 +00:00 committed by GitHub
commit 06f90c1f9a
2 changed files with 24 additions and 0 deletions

View File

@ -1077,10 +1077,24 @@ class DateTimeField(Field):
return value
if output_format.lower() == ISO_8601:
if isinstance(value, six.string_types):
format_strings = (format_prefix + timezone_extension
for format_prefix in ('%Y-%m-%dT%H:%M', '%Y-%m-%dT%H:%M:%S', '%Y-%m-%dT%H:%M:%S.%f')
for timezone_extension in ('', '%Z', '%z'))
for format_string in format_strings:
try:
value = datetime.datetime.strptime(value, format_string)
break
except ValueError:
pass
else:
raise ValueError('DateTime String %s did not match any valid format string.' % value)
value = value.isoformat()
if value.endswith('+00:00'):
value = value[:-6] + 'Z'
return value
return value.strftime(output_format)

View File

@ -993,6 +993,16 @@ class TestDateTimeField(FieldValues):
outputs = {
datetime.datetime(2001, 1, 1, 13, 00): '2001-01-01T13:00:00',
datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.UTC()): '2001-01-01T13:00:00Z',
'2001-01-01T01:01': '2001-01-01T01:01:00',
'2001-01-01T01:01:01': '2001-01-01T01:01:01',
'2001-01-01T01:01:01.01': '2001-01-01T01:01:01.010000',
# Caveat of Python 2's datetime module does not allow '+HHMM' ISO-8601 strings to be parsed in Python 2's strptime
'2001-01-01T01:01+0100' if six.PY3 else None: '2001-01-01T01:01:00+01:00' if six.PY3 else None,
'2001-01-01T01:01:01+0100' if six.PY3 else None: '2001-01-01T01:01:01+01:00' if six.PY3 else None,
'2001-01-01T01:01:01.01+0100' if six.PY3 else None: '2001-01-01T01:01:01.010000+01:00' if six.PY3 else None,
'2001-01-01T01:01UTC': '2001-01-01T01:01:00',
'2001-01-01T01:01:01UTC': '2001-01-01T01:01:01',
'2001-01-01T01:01:01.01UTC': '2001-01-01T01:01:01.010000',
None: None,
'': None,
}